比如
150.00 元
怎转化为  一百五十元整150.10 元
怎转化为  一百五十元一角

解决方案 »

  1.   

    网上抄的,仅供参考:自己写的一个比较丑的程序,但做报表时候有用
    /********************************************************************
    时间:2003.7.31
    作者:千里猪
    功能:将货币数字(阿拉伯数字)(小写)转化成中文(大写)
     
    参数:Num为字符型,小数点之后保留两位,例:Arabia_to_Chinese("1234.06")
    说明:1.目前本转换仅支持到 拾亿(元) 位,金额单位为元,不能为万元,最小单位为分
       2.不支持负数
    修改区时间:
    修改人:
    原因:修改区结束
    ********************************************************************/
    function Arabia_to_Chinese(Num){
     for(i=Num.length-1;i>=0;i--)
     {
      Num = Num.replace(",","")//替换tomoney()中的“,”
      Num = Num.replace(" ","")//替换tomoney()中的空格
     }
     Num = Num.replace("¥","")//替换掉可能出现的¥字符
     if(isNaN(Num)) { //验证输入的字符是否为数字
      alert("请检查小写金额是否正确");
      return;
     }
     //---字符处理完毕,开始转换,转换采用前后两部分分别转换---//
     part = String(Num).split(".");
     newchar = ""; 
     //小数点前进行转化
     for(i=part[0].length-1;i>=0;i--){
     if(part[0].length > 10){ alert("位数过大,无法计算");return "";}//若数量超过拾亿单位,提示
      tmpnewchar = ""
      perchar = part[0].charAt(i);
      switch(perchar){
        case "0": tmpnewchar="零" + tmpnewchar ;break;
        case "1": tmpnewchar="壹" + tmpnewchar ;break;
        case "2": tmpnewchar="贰" + tmpnewchar ;break;
        case "3": tmpnewchar="叁" + tmpnewchar ;break;
        case "4": tmpnewchar="肆" + tmpnewchar ;break;
        case "5": tmpnewchar="伍" + tmpnewchar ;break;
        case "6": tmpnewchar="陆" + tmpnewchar ;break;
        case "7": tmpnewchar="柒" + tmpnewchar ;break;
        case "8": tmpnewchar="捌" + tmpnewchar ;break;
        case "9": tmpnewchar="玖" + tmpnewchar ;break;
      }
      switch(part[0].length-i-1){
        case 0: tmpnewchar = tmpnewchar +"元" ;break;
        case 1: if(perchar!=0)tmpnewchar= tmpnewchar +"拾" ;break;
        case 2: if(perchar!=0)tmpnewchar= tmpnewchar +"佰" ;break;
        case 3: if(perchar!=0)tmpnewchar= tmpnewchar +"仟" ;break;
        case 4: tmpnewchar= tmpnewchar +"万" ;break;
        case 5: if(perchar!=0)tmpnewchar= tmpnewchar +"拾" ;break;
        case 6: if(perchar!=0)tmpnewchar= tmpnewchar +"佰" ;break;
        case 7: if(perchar!=0)tmpnewchar= tmpnewchar +"仟" ;break;
        case 8: tmpnewchar= tmpnewchar +"亿" ;break;
        case 9: tmpnewchar= tmpnewchar +"拾" ;break;
      }
      newchar = tmpnewchar + newchar;
     }
     //小数点之后进行转化
     if(Num.indexOf(".")!=-1){
     if(part[1].length > 2) {
      alert("小数点之后只能保留两位,系统将自动截段");
      part[1] = part[1].substr(0,2)
      }
     for(i=0;i<part[1].length;i++){
      tmpnewchar = ""
      perchar = part[1].charAt(i)
      switch(perchar){
        case "0": tmpnewchar="零" + tmpnewchar ;break;
        case "1": tmpnewchar="壹" + tmpnewchar ;break;
        case "2": tmpnewchar="贰" + tmpnewchar ;break;
        case "3": tmpnewchar="叁" + tmpnewchar ;break;
        case "4": tmpnewchar="肆" + tmpnewchar ;break;
        case "5": tmpnewchar="伍" + tmpnewchar ;break;
        case "6": tmpnewchar="陆" + tmpnewchar ;break;
        case "7": tmpnewchar="柒" + tmpnewchar ;break;
        case "8": tmpnewchar="捌" + tmpnewchar ;break;
        case "9": tmpnewchar="玖" + tmpnewchar ;break;
      }
      if(i==0)tmpnewchar =tmpnewchar + "角";
      if(i==1)tmpnewchar = tmpnewchar + "分";
      newchar = newchar + tmpnewchar;
     }
     }
     //替换所有无用汉字
     while(newchar.search("零零") != -1)
      newchar = newchar.replace("零零", "零");
     newchar = newchar.replace("零亿", "亿");
     newchar = newchar.replace("亿万", "亿");
     newchar = newchar.replace("零万", "万");
     newchar = newchar.replace("零元", "元");
     newchar = newchar.replace("零角", "");
     newchar = newchar.replace("零分", ""); if (newchar.charAt(newchar.length-1) == "元" || newchar.charAt(newchar.length-1) == "角")
      newchar = newchar+"整"
     return newchar;
    }
      

  2.   

    function toChineseCapitalMoney(const Num:double):string;
    const
       mnUnit:string='分角元';
       hzUnit:string='拾佰仟万拾佰仟亿拾佰仟万拾佰仟';
       hzNum:string='零壹贰叁肆伍陆柒捌玖';
    var
       szChMoney,szNum:string;
       iLen, iNum, iAddZero,i:integer;
    begin
       iAddZero:=0;
       szNum:=FormatFloat('0', DRound(Num,2)*100.0); //这样可能会有数字误差,double只有15位有效数字,这里只有13
       Result:='';
       iLen:=Length(szNum);
       if Pos('E',UpperCase(szNum))>0  then exit;
       if (iLen>18) or (iLen=0) or (Num<0) then exit; //数据错误返回   for i:=1 to iLen do
       begin
          iNum:=StrToInt(copy(szNum,i,1));
          if iNum=0 then
          begin
             if (((iLen-i-2) mod 4)=0) and ((iLen-i-3)>0) and (((iLen-i)>=8) or (iAddZero<3)) then
                szChMoney:=copy(szChMoney+hzUnit,((iLen-i-3) mod 8)*2+1,2);
             inc(iAddZero);
          end
          else
          begin
             if ((iAddZero>0) and ((iLen-i)>=2)) and (((iLen-i-1) mod 4)<>0) then
                szChMoney:=szChMoney+copy(hzNum,1,2);
             szChMoney:=szChMoney+copy(hzNum,iNum*2+1,2);
             iAddZero:=0;
          end;
          if (iAddZero<1) or ((iLen-i)=2) then
             if (iLen-i)>=3 then
             begin
                szChMoney:=szChMoney+copy(hzUnit,((iLen-i-3) mod 8)*2+1,2);
             end
          else
             szChMoney:=szChMoney+copy(mnUnit,((iLen-i) mod 3)*2+1,2);
       end;
       if Trim(szChMoney)=''  then
          szChMoney:='零元整'
       else
         if copy(szNum,Length(szNum),1)='0' then szChMoney:=szChMoney+'整';
       Result:=szChMoney;
    end;
      

  3.   

    uses
       math;
    function DRound(Value:double;cnt:byte):double;
    var
       fTmp:double;
       nTmp:double;
       k:int64;
    begin
       Result:=Value;
       if cnt>18 then exit;
       nTmp:=Power(10.0,cnt);
       fTmp:=0.5;
       fTmp:=fTmp/nTmp;
       Result:=fTmp+Result;
       Result:=Result*nTmp;
       k:=0;
       asm
          fld qword ptr Result
          //__ftol begin
          push ebp
          mov ebp,esp
          LEA ESP,k
          wait
          fstcw word ptr [ebp-$04]
          wait
          mov al,[ebp-$03]
          or [ebp-$04],$00000c01
          fldcw word ptr [ebp-$04]
          fistp qword ptr [ebp-$0c]
          mov [ebp-$03],al
          fldcw word ptr [ebp-$04]
          mov eax ,[ebp-$0c]
          mov edx,[ebp-$08]
          mov esp,ebp
          pop ebp
          //__ftol end
          push esp
          lea esp,k
          mov [esp],eax
          add esp,4
          mov [esp],edx
          mov esp,ebp
          pop esp
          fild qword ptr k
          fstp qword ptr Result
          fld qword ptr nTmp
          fdivr qword ptr Result
          fstp qword ptr Result
       end;
    end;
    ==========================================
    特别说明一下DRound函数在数值较小时四舍五入会得不到意想的结果,这是因为浮点数运算的问题,暂时尚未解决。