请问如何将类似于¥1,049,406.06的小写金额转换为大写?算法如何?请附上源代码!

first_lover 2001-09-10 05:58:14
...全文
396 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ss8 2001-09-15
  • 打赏
  • 举报
回复
function SmToBig(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;
first_lover 2001-09-15
  • 打赏
  • 举报
回复
多谢各位指点
bewill 2001-09-11
  • 打赏
  • 举报
回复
其实算法不是很难,你只要想一想我们习惯的读法就可以了。
1、我们的读法是以‘’(表示不读)、万、亿为单位的,也就是说每四位一个单元
(我描述的不好)。最后加一个元。(小数部分比较简单,不讨论)
2、每四位中最低位或最低几位为零都不读。
3、非最低位为零时,无论连续出现几个零都只读一个零。

这样应该比较清楚了吧。
gfong 2001-09-10
  • 打赏
  • 举报
回复

数字金额转换为中文大写另一方法

关键字:将数字转换为符合使用习惯的大写金额


Function szzf(num:Double):String;
const
szd:string = '零壹贰叁肆伍陆柒捌玖';
dwd:string = '分角元拾佰仟万拾佰仟亿拾佰仟';
kdwd:string = '零仟零佰零拾零角零分';
var
n1,n2,nm:shortint;
je,zf:string;
getastr:string[4];//用于临时保存一个字符
code,getanum:integer;

begin
//检测数据范围 最大999999999999.99 最小0.00
If (num > 999999999999.99) Or (num = 0) Or (num < 0.01) Then
begin
szzf := '';
Exit;
End;
je:= '';
//将数字从右到左读成大写金额
str(num:15:2,zf); //将数字转换“#####.##”格式的字符格式
zf:=trim(zf);
n1 := Length(zf); //数字长度
n2 := 1;
For nm := 1 To n1 do
begin
//getastr:=;
If copy(zf,n1,1)<> '.' Then //跳过小数点
begin
getastr:=copy(zf, n1, 1);
val(getastr,getanum,code);
getastr:=copy(szd, (getanum+1)*2 - 1, 2);
je := getastr+copy(dwd, n2*2 - 1, 2)+ je;
n2 := n2 + 1;
end;
n1 := n1 - 1;
end;
//去掉大写金额中不符合使用习惯的部分
n1:= Length(je); //字符串长度
for nm:=1 to (n1 div 4)-1 do
begin
n2:=n1-nm*4+1;
getastr:=copy(je,n2,n2+4);
if AnsiPos(getastr,kdwd)<>0 then
je:=copy(je,1,n1-nm*4+2)+copy(je,n1-nm*4+5,length(je));
end;
n1:=AnsiPos('零零',je);
while n1<>0 do
begin
je:=copy(je,1,n1+1)+copy(je,n1+4,length(je));
n1:=AnsiPos('零零',je);
end;
//当出现“零亿”,“零万”,“零元”时去掉“零”
n1:=AnsiPos('零亿',je);
if n1<>0 then
je:=copy(je,1,n1-1)+copy(je,n1+2,length(je));
n1:=AnsiPos('零万',je);
if n1<>0 then
je:=copy(je,1,n1-1)+copy(je,n1+2,length(je));
n1:=AnsiPos('零元',je);
if n1<>0 then
je:=copy(je,1,n1-1)+copy(je,n1+2,length(je));
//处理最后出现的“零”
n1:=length(je);
If copy(je,n1-1,n1)='零' Then je:=copy(je,1,n1-2);
n1:=length(je);
getastr:=copy(je,n1-1,2);
If getastr='元'//如果没小数部分则加“整“
Then je:=je+'整'
else
if (getastr<>'分') and (getastr<>'角') then je:=je+'元整';
szzf:= je;
End;

skytears 2001-09-10
  • 打赏
  • 举报
回复
如下为一个简单的小写金额转换为大写的函数,其思路简单(可以说烂吧,居然利用了位置来转换),但是它几乎可以无限制的转换,只要你能读得出来和写得进去:
function Tform1.SmallTOBig(small:real):string;
var SmallMonth,BigMonth:string;
wei1,qianwei1:string[2];
qianwei,dianweizhi,qian:integer;
begin
{------- 修改参数令值更精确 -------}
{小数点后的位置,需要的话也可以改动-2值}
qianwei:=-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;
{判断大写位置,可以继续增大到real类型的最大值}
case qianwei of
-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;
调用如下“edit1.text:=SmallTOBig(1234567890.1234);”他自动默认小数点后两位


——摘自《心灵之家》

5,388

社区成员

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

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