数字转换大写人民币的delphi实现

Posted on 2010-05-23 15:56  清风轩  阅读(2811)  评论(0编辑  收藏  举报

之前用Access作一个应用,但找不到货币转换成大写人民币的功能(当然可以通过excel 转换,但不在一个应用上,放弃)。以为比较简单,自己试写,谁知用了两个晚上,才基本实现,但没有小数点(元)以下货币的转换。也没有兆的判断。而且对字符的合法性也没有检验。今天有时间,将其完善一下。(可能还会有考虑不周的地方)

思路:

1、判断是否带有小数点的金额,如果是,就找出小数点所在数据。该位字符不进行转换。

2、小数点前的作为整数位,进行转换。整数位的每一位都有表示金额的级别:拾、佰、仟。而且还有万、亿的级别。

3、小数点后的作为角、分、厘处理。

4、如果有连续的零,只显示一个零。如50006,显示为伍万零陆。如果是发生在拾、佰、仟位,该零还要去掉。

 

function TForm1.changeRmb(const strRmb:string):string; 
var 
  txt,strhighlevel:string; 
  i,n,m,ilen,ipos:Integer;    //n记录整数部分长度,m记录分数部分长度 
   strarray,strlevel:array of string; 
   p:pchar; 
   ispoint:boolean;//判断是否有小数点 
begin 
  ispoint:=false; 
  result:=''; 
  ipos:=0; 
  m:=0; 
  txt:=Trim(strRmb); 
  i:=1; 
   p:=PChar(txt); 
//去除开头的0,以及. 
if ((txt[1]='0') and (txt[2]<>'.')) or (txt[1]='.') then 
begin 
   ShowMessage('第1位不能为0或者是.,退出操作'); 
   exit; 
end; 
//检查字符的合法性 
while (i<length(txt))do 
begin 
if (p^>'9') or ((p^<'0') and (P^<>'.'))  then //ord('.')=46 
begin 
          ShowMessage(PChar('第'+inttostr(i)+'位包含非数字字符,将退出操作')); 
          Exit; 
end; 
if P^='.' then 
if ispoint then 
begin 
         showmessage('太多小数点,将退出!'); 
         exit; 
end 
else 
begin 
        ipos:=i; 
        ispoint:=true; 
end; 
      Inc(p); 
      Inc(i); 
end;//while 
   ilen:=Length(txt); 
if ispoint then 
begin 
     n:=ipos-1; 
     m:=ilen-ipos; 
end 
else 
    n:=ilen; 
//判断是否超过万,或亿 
if m>3 then 
begin 
       ShowMessage('小数点后位数超过3,无法转换!'); 
       Exit; 
end; 
  SetLength(strarray,ilen+8); 
  SetLength(strlevel,ilen+8); 
for i:=iLen downto 1 do 
begin 
if txt[i]<>'.' then 
case strtoint(txt[i]) of 
1:strarray[i]:='壹'; 
2:strarray[i]:='贰'; 
3:strarray[i]:='叁'; 
4:strarray[i]:='肆'; 
5:strarray[i]:='伍'; 
6:strarray[i]:='陆'; 
7:strarray[i]:='柒'; 
8:strarray[i]:='捌'; 
9:strarray[i]:='玖'; 
0: 
begin 
         strarray[i]:='零'; 
if i<ilen then //如果低位也为零,低位零不显示 
if (strarray[i+1]= '') or (strarray[i+1]= '零') then 
begin 
//strarray[i+1]:= ''; 
              strarray[i]:= ''; 
end; 
if i=n then strarray[i]:=''; 
         strlevel[i]:=''; 
end; 
end; //case 
end; 
//先处理 小数点部分 
if m>0 then 
begin 
for i:=m downto 1 do 
begin 
        strlevel[ipos+i]:=''; 
case i-1 of 
0: 
if  txt[ipos+i]='0' then 
                strarray[ipos+i]:='' 
else 
               strlevel[ipos+i]:='角'; 
1: 
if  txt[ipos+i]='0' then 
                  strarray[ipos+i]:='' 
else 
               strlevel[ipos+i]:='分'; 
2: 
if  txt[ipos+i]='0' then 
               strarray[ipos+i]:='' 
else   strlevel[ipos+i]:='厘'; 
end; 
       Result:=strarray[ipos+i]+strlevel[ipos+i]+result; 
end; 
end; 
if ispoint and (txt[ipos-1]='0') and (n=1) then 
    Result:=result+'' //如果少于1块时,不要显示元。 
else 
    Result:='元'+result; 
for i:=n downto 1 do 
begin 
case n-i of 
0,4,8,12: strlevel[i]:=''; 
1,5,9,13: strlevel[i]:='拾'; 
2,6,10,14: strlevel[i]:='佰'; 
3,7,11,15: strlevel[i]:='仟'; 
end; //case 
if (txt[i]='0')  then strlevel[i]:=''; 
//要处理零 以及加上万、亿 
if n-i=4 then 
begin 
if  strarray[i]='零' then   strarray[i]:=''; 
      Result:=strarray[i]+strlevel[i]+'万'+result 
end 
else if n-i=8 then 
begin 
if  strarray[i]='零' then   strarray[i]:=''; 
      Result:=strarray[i]+strlevel[i]+'亿'+result 
end //begin 
else if n-i=12 then 
begin 
if  strarray[i]='零' then   strarray[i]:=''; 
      Result:=strarray[i]+strlevel[i]+'兆'+result 
end //begin 
else 
    Result:=strarray[i]+strlevel[i]+result; 
end; //for 
end;

Copyright © 2024 清风轩
Powered by .NET 8.0 on Kubernetes