如何将数字金额转换成大写金额?在线等

wjhhero 2003-02-14 04:38:36
如:2,345,678.91 转换成
贰佰叁拾肆万伍仟陆佰柒拾捌元玖角壹分
...全文
775 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
netwolfds 2003-02-14
  • 打赏
  • 举报
回复
function tform1.num_str(ls:variant):string;
var
dx_sz,dx_dw,str_int,str_dec,dx_str,fu:string;
a,b,b2,c,d:string;
num_int,num_dec,len_int,i,a_int,pp:integer;
begin
dx_sz:='零壹贰叁肆伍陆柒捌玖';
dx_dw:='万仟百拾亿仟百拾万仟百拾元';
//处理金额小于零情况
if ls<0 then
begin
ls:=ls*(-1);
fu:='负';
end
else
fu:=' ';
//取得整数值及整数串
dx_str:=ls;
if (ls>0) and (ls<1) then dx_str:='0'+dx_str;
pp:=pos('.',dx_str);
if pp>0 then str_int:=copy(dx_str,1,pos('.',dx_str)-1) else str_int:=dx_str;
num_int:=strtoint(str_int);

//取得小数值及小数串
if (ls>0) and (ls<1) then num_dec:=ls*100
else num_dec:=(ls-num_int)*100;
str_dec:=inttostr(num_dec);
len_int:=length(str_int);
dx_str:=' ';
//转换整数部分
for i:=1 to len_int do
begin
//a为小写数字字符,b为对应的大写字符
//c为对应大写单位,d为当前大写字符串的最后的一个汉字
a:=copy(str_int,i,1);
a_int:=strtoint(a);
b:=copy(dx_sz,(a_int*2+1),2);
c:=copy(dx_dw,((13-len_int+i-1)*2+1),2);
if dx_str<>'' then d:=copy(dx_str,length(dx_str)-1,2)
else d:=' ';
if (b='零') and ((d='零') or(b=b2) or (c='元') or (c='万') or (c='亿')) then b:='';
if (a='0') and (c<>'元') and (c<>'万') and (c<>'亿') then c:='';
if (c='元') or ((c='万') or (c='亿')) and (d='零') and (a='0') then
begin
dx_str:=copy(dx_str,1,length(dx_str)-2);
d:=copy(dx_str,length(dx_str)-1,2);
if ((c='元') and (c='万') and (c='亿')) then c:='';
end;
dx_str:=dx_str+b+c;
b2:=b;
end;
//处理金额小于1的情况
if length(dx_str)<=2 then dx_str:='';
if (num_dec<10) and (ls>0) then
begin
a_int:=strtoint(str_dec);
b:=copy(dx_sz,(a_int*2+1),2);
if num_dec=0 then dx_str:=dx_str+'整';
if num_dec>0 then dx_str:=dx_str+'零'+b+'分';
end;
if num_dec>=10 then
begin
a_int:=strtoint(copy(str_dec,1,1));
a:=copy(dx_sz,(a_int*2+1),2);
a_int:=strtoint(copy(str_dec,2,1));
b:=copy(dx_sz,(a_int*2+1),2);
if a<>'零' then a:=a+'角';
if b<>'零' then b:=b+'分' else b:='';
dx_str:=dx_str+a+b;
end;
if ls=0 then dx_str:='零元整';
dx_str:=fu+dx_str;
result:=dx_str;
end;
Means_pan 2003-02-14
  • 打赏
  • 举报
回复
写一个函数,用循环来匹配替换
siyu2002 2003-02-14
  • 打赏
  • 举报
回复
function SmallTOBig(small:real):string;

var
SmallMonth,BigMonth:string;
wei1,qianwei1:string[2];
qianwei,dianweizhi,qian:integer;
pre0 :integer;
begin

{------- 修改参数令值更精确 -------}
qianwei:=-2;{小数点后的位置,需要的话也可以改动-2值}
Smallmonth:=formatfloat('0.00',small);{转换成货币形式,需要的话小数点后加多几个零}
dianweizhi :=pos('.',Smallmonth);{小数点的位置}
BigMonth := '';
pre0 := 1;
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;
if wei1='零' then
begin
if (BigMonth<>'') and (pre0 = 0) then
begin
if qianwei = 0 then
BigMonth := qianwei1+BigMonth
else
BigMonth :=wei1+BigMonth;
end;
if (BigMonth='') and (pre0 = 0) then
BigMonth :=qianwei1+'整';
if (qianwei mod 4 =0) and (qianwei>0) then
BigMonth := qianwei1+BigMonth;
pre0 := 1;
end
else
begin
BigMonth :=wei1+qianwei1+BigMonth;{组合成大写金额}
pre0 := 0;
end;

inc(qianwei);
end
else
pre0:=0;

if copy(BigMonth,length(BigMonth)-1,2)='元' then
BigMonth:=BigMonth+'整' ;
SmallTOBig:=BigMonth;
end;

end;
蝈蝈太阳 2003-02-14
  • 打赏
  • 举报
回复
逐个字符串对着翻译,包装成一个函数比较好。

5,939

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧