如下为一个简单的小写金额转换为大写的函数,其思路简单(可以说烂吧,居然利用了位置来转换),但是它几乎可以无限制的转换,只要你能读得出来和写得进去:
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);”他自动默认小数点后两位
——摘自《心灵之家》

解决方案 »

  1.   

     
    数字金额转换为中文大写另一方法  关键字:将数字转换为符合使用习惯的大写金额 
    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; 
     
      

  2.   

    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;