用Delphi编制金额大写转换程序
(作者:杨波 2000年04月20日 14:04)
在从事与财务相关的软件开发过程中,通常要求将小写金额转换成相应的大写金额,并打印在大写金额栏中。下面是用Delphi3.0编制的一个转换函数,能够方便的在程序中调用,并返回字符串。
1.定义函数num—str
function 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;
//dx—str为返回字符串
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—intdo
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(d=′万′))or((c=′万′)and(d=′亿′)) 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;
2.调用方法
函数参数采用Variant类型,调用时参数值可以是实型,也可以是字符串,非常方便,下面举例说明:
新建窗口,在相应pas文件中加入num—str函数,并在窗口中添加Button1和Edit1、Edit2控件,双击Button1输入以下代码,运行程序即可:
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.text:=num—str(202055010.32);
//也可以在Edit2中输入数串调用
//Edit1.text:=num—str(Edit2.text);
end;
fpsky (2002-02-28 13:29:00)
这样更好:
function FourNumToChnNum(Str:string;ChnNum:string;var Pre:boolean):string;
const
ChnNum2='零壹贰叁肆伍陆柒捌玖';
var
i,j,Len:integer;
begin
Result := '';
Len := Length(str) ;
for i:=1 to Lendo
begin
j := Ord(str)-48;
if j=0 then
Pre := True
else
begin
if Pre then
Result := Result + '零';
Result := Result + Copy(ChnNum2,j*2+1,2) + Trim(Copy(ChnNum,(Len - i) * 2+1,2));
Pre := False;
end;
end;
end;
function StringToChnNum(str:string):string;
const
ChnNum1='圆万亿兆';
var
i,Len,Len1,Level,Start:integer;
s1,s:string;
Pre: Boolean;
begin
Result := '';
Len := Pos('.',str)-1;
Level := (Len + 3) div 4 ;
Len1 := Len mod 4 ;
if Len1=0 then
Len1 := 4;
Start := 1;
Pre := False;
for i := 1 to Leveldo
begin
s := Copy(str,Start,Len1);
s1 := FourNumToChnNum(s,' 拾佰仟',Pre);
// 注意有两个空格
if s1<>'' then
Result := Result + s1 + Copy(ChnNum1,(Level-i)*2+1,2);;
Start := Start + Len1;
Len1 := 4;
end;
s1 := FourNumToChnNum(Copy(str,Len+2,2),'分角',Pre);
if s1 = '' then
s1 := '整';
Result := Result + s1 ;
end;
function RealToChnNum(realnum:real;Width:integer):string;
var
s:string;
begin
Str(realnum:Width:2,s);
Result := StringToChnNum(Trim(s));
end;