如下为一个简单的小写金额转换为大写的函数,其思路简单(可以说烂吧,居然利用了位置来转换),但是它几乎可以无限制的转换,只要你能读得出来和写得进去:
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);”他自动默认小数点后两位
——摘自《心灵之家》
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);”他自动默认小数点后两位
——摘自《心灵之家》
解决方案 »
- access数据库查询的时间类型问题
- 关于CxGrid和AdoQuery同步问题
- 在线等候
- 代朋友找个兼职, 要求很熟悉delphi的内联汇编,熟悉hook.
- 问一个关于COM的问题
- 一个关于图表制作的问题,请各位高手指点小弟一下,万分感激!!!(高分求解答)
- 救命!关于ADODATASET中的commandtext长度问题 50分
- 第一次放这么多的分>>>>>>>>>>请进来看看(一周以内结帖)
- 客户端拨号上网如何访问远程数据库服务器?
- 还是那个EDIT里输入数字的问题,有时输入的不只是整数。需要输入小数,那样就要用到'.',但这个点也不是数字。如何使它也能输入呢。如3.44?
- 老狼:祝假日愉快!我是老刺
- 怎么设定database 的连接时间?
数字金额转换为中文大写另一方法 关键字:将数字转换为符合使用习惯的大写金额
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;
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;