CSDN首页 | 新闻聚焦 | 共享软件 | 俱乐部 | 开发文档 | 专家门诊 | 招聘求职 | Linux园地 | 程序员杂志
--------------------------------------------------------------------------------
我要回复 | 我感兴趣 | 打印贴子 | 推荐给朋友 | 关闭窗口
主 题:怎么样能实现将小写金额转换为大写金额?
作 者:bwi
所属论坛:Delphi
问题点数:24
回复次数:5
发表时间:2001-8-11 21:52:06
回复贴子:
回复人: summernightrain(夏夜雨) (2001-8-11 21:53:59) 得12分
给你一个函数:
function SmallTOBig(small:real):string;
var SmallMonth,BigMonth:string;
wei1,qianwei1:string[2];
wei,qianwei,dianweizhi,qian:integer;
begin
{------- 修改参数令值更精确 -------}
qianwei:=-2;{小数点后的位置,需要的话也可以改动-2值}
Smallmonth:=formatfloat('0.00',small);{转换成货币形式,需要的话小数点后加多几个零}
{---------------------------------}
dianweizhi :=pos('.',Smallmonth);{小数点的位置}
for qian:=length(Smallmonth) downto 1 do{循环小写货币的每一位,从小写的右边位置到左边}
begin
if qian<>dianweizhi then{如果读到的不是小数点就继续}
begin
case strtoint(copy(Smallmonth,qian,1)) of{位置上的数转换成大写}
1:wei1:='壹'; 2:wei1:='贰';
3:wei1:='叁'; 4:wei1:='肆';
5:wei1:='伍'; 6:wei1:='陆';
7:wei1:='柒'; 8:wei1:='捌';
9:wei1:='玖'; 0:wei1:='零';
end;
case qianwei of{判断大写位置,可以继续增大到real类型的最大值}
-3:qianwei1:='厘';
-2:qianwei1:='分';
-1:qianwei1:='角';
0 :qianwei1:='元';
1 :qianwei1:='拾';
2 :qianwei1:='佰';
3 :qianwei1:='千';
4 :qianwei1:='万';
5 :qianwei1:='拾';
6 :qianwei1:='佰';
7 :qianwei1:='千';
8 :qianwei1:='亿';
9 :qianwei1:='十';
10:qianwei1:='佰';
11:qianwei1:='千';
end;
inc(qianwei);
BigMonth :=wei1+qianwei1+BigMonth;{组合成大写金额}
end;
end;
SmallTOBig:=BigMonth;
end;
回复人: tikkypeng(不知火幻安) (2001-8-11 21:54:02) 得12分
function MoneyToUpper(const NumBer:Double):String;
var StrNumber,AUpperNum,AMoneyUnit:String;
UpperNum:array[0..9] of String;
MoneyUnit:array[1..16]of String;
I:Integer;
AZero:Boolean;
N:Double;
begin
UpperNum[1] := '壹' ;
UpperNum[2] := '贰' ;
UpperNum[3] := '叁' ;
UpperNum[4] := '肆' ;
UpperNum[5] := '伍' ;
UpperNum[6] := '陆' ;
UpperNum[7] := '柒' ;
UpperNum[8] := '捌' ;
UpperNum[9] := '玖' ; MoneyUnit[1] := '万' ;
MoneyUnit[2] := '仟' ;
MoneyUnit[3] := '佰' ;
MoneyUnit[4] := '拾' ;
MoneyUnit[5] := '亿' ;
MoneyUnit[6] := '仟' ;
MoneyUnit[7] := '佰' ;
MoneyUnit[8] := '拾' ;
MoneyUnit[9] := '万' ;
MoneyUnit[10] := '仟' ;
MoneyUnit[11] := '佰' ;
MoneyUnit[12] := '拾' ;
MoneyUnit[13] := '元' ;
MoneyUnit[14] := '.' ;
MoneyUnit[15] := '角' ;
MoneyUnit[16] := '分' ; AZero := False ;
AUpperNum := '' ;
AMoneyUnit := '' ;
result := '';
if NumBer < 0 then
begin
result := '负' ;
N := - NumBer ;
end
else
N := NumBer ;
Str(N:16:2,StrNumber); for I := 1 to 16 do
begin
if StrNumber[I] <> ' ' then
begin
AMoneyUnit := MoneyUnit[I];
if StrNumber[I] = '0' then
begin
if AZero and (copy(result,Length(result)-1,2)='零') then
result := copy(result,1,Length(result)-2);
case I of
1..4,6..8,10..12:begin // 万,仟,佰,拾
AUpperNum := '零' ;
AMoneyUnit := '' ;
end;
5,9,13: begin // 亿,万,元
if StrToFloat(StrNumber) < 1 then AMoneyUnit := '' ;
AUpperNum := '' ;
end;
15: begin // 角
if StrToFloat(StrNumber) < 1 then AUpperNum := ''
else AUpperNum := '零' ;
AMoneyUnit := '' ;
end;
16: begin // 分
AUpperNum := '' ;
AMoneyUnit := '' ;
end;
end;
AZero := True ;
end
else
begin
if StrNumber[I] = '.' then
begin
AUpperNum := '';
AMoneyUnit := '';
end
else
begin
AZero := False ;
AUpperNum := UpperNum[StrToInt(StrNumber[I])];
end
end;
result := result + (AUpperNum + AMoneyUnit)
end;
end;
result := result + '整' ;
end;
回复人: bwi(奔奔小熊) (2001-8-11 22:09:17) 得0分
如果两位能再解释一下就好了,先各给5分,略表心意!
回复人: summernightrain(夏夜雨) (2001-8-12 13:48:25) 得0分
你可以单步调试看看就知道了!
回复人: bwi(奔奔小熊) (2001-8-12 18:39:14) 得0分
谢谢,我已经试出来了!
--------------------------------------------------------------------------------
我要回复:(请您对您的言行负责,遵守中华人民共和国有关法律、法规,尊重网上道德)
如果你只是觉得这个贴子好,而没想留言的话,请点击后面的贴子提前连接。
返回问题 | 关闭窗口
const
UPNUMSTRS: array[0..9] of string = ('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
UNITSTRS: array[1..16] of string = ('拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟', '兆', '拾', '佰', '仟', '万');
function MoneyToUpperCaseStr(M: Extended): string;
var
IntPart: Integer;
FloatPart: Integer;
K, X: Integer;
ZeorCount: Integer;
PI, PF: string;
begin
if M > 1000000000 then
begin
Result := '数据溢出';
Exit;
end;
IntPart := Trunc(M);
M := M * 100;
FloatPart := Trunc(M - IntPart * 100);
if IntPart + FloatPart = 0 then
begin
Result := '零元整';
Exit;
end;
PI := '';
PF := '';
K := 0;
ZeorCount := 0;
while IntPart > 0 do
begin
X := IntPart mod 10 ;
IntPart := Trunc(IntPart /10);
if X > 0 then
begin
if (ZeorCount = 0)or(ZeorCount = K) then
begin
if K > 0 then
begin
if (K = 8)and(ZeorCount = 8) then
PI := Copy(PI, 3, Length(PI) - 2);
if (K = 12)and(ZeorCount = 12) then
PI := Copy(PI, 2, Length(PI) - 2);
PI := UPNUMSTRS[X] + UNITSTRS[K] + PI;
end else
begin
PI := UPNUMSTRS[X] + PI;
end;
end else
begin
if K in [5, 9, 13] then
PI := UPNUMSTRS[X] + UNITSTRS[K] + PI
else
PI := UPNUMSTRS[X] + UNITSTRS[K] + UPNUMSTRS[0] + PI;
end;
ZeorCount := 0;
end else
begin
if (K in [4, 8, 12]) then
begin
if (K = 8)and(ZeorCount = 8) then
PI := Copy(PI, 3, Length(PI) - 2);
if (K = 12)and(ZeorCount = 12) then
PI := Copy(PI, 2, Length(PI) - 2);
PI := UNITSTRS[K] + PI;
end;
Inc(ZeorCount);
end;
Inc(K);
end;
if PI <> '' then
PI := PI + '元';
if FloatPart > 0 then
begin
X := Trunc(FloatPart / 10);
if X = 0 then
PF := '零'
else
PF := UPNUMSTRS[X]+'角';
X := FloatPart - X * 10;
PF := PF + UPNUMSTRS[X]+'分'
end else
PF := '整';
Result := PI + PF;
end;
//很久以前编的
//自己修改修改
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}function Iif(mBool: Boolean; mDataA: Variant; mDataB: Variant): Variant;
begin
if mBool then
Result := mDataA
else Result := mDataB;
end; { Iif }function StrLeft(const mStr: string; mDelimiter: string): string;
begin
Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1);
end; { StrLeft }function StrRight(const mStr: string; mDelimiter: string): string;
begin
if Pos(mDelimiter, mStr) <= 0 then
Result := ''
else Result := Copy(mStr, Pos(mDelimiter, mStr) + Length(mDelimiter), MaxInt);
end; { StrRight }function AToC(mFloat: Real): string; { 返回中文表示的数字 }
type
TEnumMoneyUnitCn = (eMUCYuan, eMUCJiao, eMUCFen); //中文货币单位枚举类型
const
cMaxCnNumMask = 12; //中文货币最大数位
cCnNumCodeUp: array['0' .. '9'] of string = //中文数字列表2
('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
cCnNumMaskUp: array[1 .. cMaxCnNumMask] of string = //中文数位列表2
('', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟');
cCnMoneyCode: array[TEnumMoneyUnitCn] of string = //中文货币单位列表
('圆', '角', '分');
var
sTemp, lStr, rStr: string;
J: Integer;{ ---------------------begin------------------------ }
function fZsLeft(s: string): string;
var
I, K, Len: Integer;
Hxm: Boolean; //出现0
Lcy: Boolean;
begin
Result := '';
Len := Length(s);
J := 0;
if s <> '0' then begin
Hxm := False; Lcy := False;
for I := 1 to Len do begin
K := Len - I + 1;
if s[I] <> '0' then begin
J := 0;
if Hxm then Result := Result + cCnNumCodeUp['0'];
Result := Result + Concat(cCnNumCodeUp[s[I]], cCnNumMaskUp[K]);
Hxm := False;
Lcy := True;
end
else
begin
Hxm := True;
if (Lcy) and ((K + 4) mod 4 = 1) then begin
J := K;
if (Lcy) and (J <> 0) then Result := Result + cCnNumMaskUp[J];
Lcy := False;
end;
end; { if[s[I] <> '0'] }
end; { for }
end { if[s <> '0'] }
else Result := cCnNumCodeUp['0'];
end; { fZsLeft } function fZsRight(s: string): string;
begin
Result := '';
if s <> '00' then begin
Result := Result + Iif((Int(mFloat) = 0) and (s[1] = '0'), '',
cCnNumCodeUp[s[1]]) + Iif(s[1] <> '0',
cCnMoneyCode[eMUCJiao], '');
if s[2] <> '0' then
Result := Result + cCnNumCodeUp[s[2]] + cCnMoneyCode[eMUCFen];
end
else Result := '整';
end; { fZsLeft }
{ ---------------------end------------------------ }begin
if mFloat <> 0 then begin
Str(mFloat:0:2, sTemp);
lStr := fZsLeft(StrLeft(sTemp, '.'));
rStr := fZsRight(StrRight(sTemp, '.'));
Result := Iif(lStr = cCnNumCodeUp['0'], '', lStr + cCnMoneyCode[eMUCYuan])
+ rStr;
end
else Result := cCnNumCodeUp['0'] + cCnMoneyCode[eMUCYuan] + '整';
end; { ZsAToC }procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := AToC(StrToFloatDef(Edit1.Text, 0));
end;end.