CSDN首页 | 新闻聚焦 | 共享软件 | 俱乐部 | 开发文档 | 专家门诊 | 招聘求职 | Linux园地 | 程序员杂志 
--------------------------------------------------------------------------------
 
我要回复 | 我感兴趣 | 打印贴子 | 推荐给朋友 | 关闭窗口  
主  题:怎么样能实现将小写金额转换为大写金额?
作  者:bwi
所属论坛:Delphi
问题点数:24
回复次数:5
发表时间:2001-8-11 21:52:06
 
  
   
回复贴子: 
回复人: summernightrain(夏夜雨) (2001-8-11 21:53:59)  得12分 
给你一个函数:
function SmallTOBig(small:real):string;
var SmallMonth,BigMonth:string;
    wei1,qianwei1:string[2];
    wei,qianwei,dianweizhi,qian:integer;
begin
  {------- 修改参数令值更精确 -------}
  qianwei:=-2;{小数点后的位置,需要的话也可以改动-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;
          case qianwei of{判断大写位置,可以继续增大到real类型的最大值}
            -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;  
回复人: tikkypeng(不知火幻安) (2001-8-11 21:54:02)  得12分 
function MoneyToUpper(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;
 
回复人: bwi(奔奔小熊) (2001-8-11 22:09:17)  得0分 
如果两位能再解释一下就好了,先各给5分,略表心意!  
回复人: summernightrain(夏夜雨) (2001-8-12 13:48:25)  得0分 
你可以单步调试看看就知道了!  
回复人: bwi(奔奔小熊) (2001-8-12 18:39:14)  得0分 
谢谢,我已经试出来了!   
--------------------------------------------------------------------------------
 
我要回复:(请您对您的言行负责,遵守中华人民共和国有关法律、法规,尊重网上道德)  
如果你只是觉得这个贴子好,而没想留言的话,请点击后面的贴子提前连接。   
返回问题 | 关闭窗口   
   
 
    
 

解决方案 »

  1.   

    我有一个送给你吧,别忘了给分
    const
      UPNUMSTRS: array[0..9] of string = ('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
      UNITSTRS: array[1..16] of string = ('拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟', '兆', '拾', '佰', '仟', '万');
      
    function MoneyToUpperCaseStr(M: Extended): string;
    var
      IntPart: Integer;
      FloatPart: Integer;
      K, X: Integer;
      ZeorCount: Integer;
      PI, PF: string;
    begin
      if M > 1000000000 then
      begin
        Result := '数据溢出';
        Exit;
      end;
      IntPart := Trunc(M);
      M := M * 100;
      FloatPart := Trunc(M - IntPart * 100);
      if IntPart + FloatPart = 0 then
      begin
        Result := '零元整';
        Exit;
      end;
      PI := '';
      PF := '';
      K := 0;
      ZeorCount := 0;
      while IntPart > 0 do
      begin
        X := IntPart mod 10 ;
        IntPart := Trunc(IntPart /10);
        if X > 0 then
        begin
          if (ZeorCount = 0)or(ZeorCount = K) then
          begin
            if K > 0 then
            begin
              if (K = 8)and(ZeorCount = 8) then
                PI := Copy(PI, 3, Length(PI) - 2);
              if (K = 12)and(ZeorCount = 12) then
                PI := Copy(PI, 2, Length(PI) - 2);
              PI := UPNUMSTRS[X] + UNITSTRS[K] + PI;
            end else
            begin
              PI := UPNUMSTRS[X] + PI;
            end;
          end else
          begin
            if K in [5, 9, 13] then
              PI := UPNUMSTRS[X] + UNITSTRS[K] + PI
            else
              PI := UPNUMSTRS[X] + UNITSTRS[K] + UPNUMSTRS[0] + PI;
          end;
          ZeorCount := 0;
        end else
        begin
          if (K in [4, 8, 12]) then
          begin
            if (K = 8)and(ZeorCount = 8) then
              PI := Copy(PI, 3, Length(PI) - 2);
            if (K = 12)and(ZeorCount = 12) then
              PI := Copy(PI, 2, Length(PI) - 2);
            PI := UNITSTRS[K] + PI;
          end;
          Inc(ZeorCount);
        end;
        Inc(K);
      end;
      if PI <> '' then
        PI := PI + '元';
      if FloatPart > 0 then
      begin
        X := Trunc(FloatPart / 10);
        if X = 0 then
          PF := '零'
        else
          PF := UPNUMSTRS[X]+'角';
        X := FloatPart - X * 10;
        PF := PF + UPNUMSTRS[X]+'分'
      end else
        PF := '整';
      Result := PI + PF;
    end;
      

  2.   

    //可以将就用吧
    //很久以前编的
    //自己修改修改
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}function Iif(mBool: Boolean; mDataA: Variant; mDataB: Variant): Variant;
    begin
      if mBool then
        Result := mDataA
      else Result := mDataB;
    end; { Iif }function StrLeft(const mStr: string; mDelimiter: string): string;
    begin
      Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1);
    end; { StrLeft }function StrRight(const mStr: string; mDelimiter: string): string;
    begin
      if Pos(mDelimiter, mStr) <= 0 then
        Result := ''
      else Result := Copy(mStr, Pos(mDelimiter, mStr) + Length(mDelimiter), MaxInt);
    end; { StrRight }function AToC(mFloat: Real): string; { 返回中文表示的数字 }
    type
      TEnumMoneyUnitCn  = (eMUCYuan, eMUCJiao, eMUCFen); //中文货币单位枚举类型
    const
      cMaxCnNumMask = 12;                                 //中文货币最大数位
      cCnNumCodeUp: array['0' .. '9'] of string =     //中文数字列表2
      ('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
      cCnNumMaskUp: array[1 .. cMaxCnNumMask] of string = //中文数位列表2
      ('', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟');
      cCnMoneyCode: array[TEnumMoneyUnitCn] of string =   //中文货币单位列表
      ('圆', '角', '分');
    var
      sTemp, lStr, rStr: string;
      J: Integer;{ ---------------------begin------------------------ }
      function fZsLeft(s: string): string;
      var
        I, K, Len: Integer;
        Hxm: Boolean; //出现0
        Lcy: Boolean;
      begin
        Result := '';
        Len := Length(s);
        J := 0;
        if s <> '0' then begin
          Hxm := False; Lcy := False;
          for I := 1 to Len do begin
            K := Len - I + 1;
            if s[I] <> '0' then begin
              J := 0;
              if Hxm then Result := Result + cCnNumCodeUp['0'];
              Result := Result + Concat(cCnNumCodeUp[s[I]], cCnNumMaskUp[K]);
              Hxm := False;
              Lcy := True;
            end
            else
            begin
              Hxm := True;
              if (Lcy) and ((K + 4) mod 4 = 1) then begin
                J := K;
                if (Lcy) and (J <> 0) then Result := Result + cCnNumMaskUp[J];
                Lcy := False;
              end;
            end; { if[s[I] <> '0'] }
          end; { for }
        end { if[s <> '0'] }
        else Result := cCnNumCodeUp['0'];
      end; { fZsLeft }  function fZsRight(s: string): string;
      begin
        Result := '';
        if s <> '00' then begin
          Result := Result + Iif((Int(mFloat) = 0) and (s[1] = '0'), '',
            cCnNumCodeUp[s[1]]) + Iif(s[1] <> '0',
            cCnMoneyCode[eMUCJiao], '');
          if s[2] <> '0' then
            Result := Result + cCnNumCodeUp[s[2]] + cCnMoneyCode[eMUCFen];
        end
        else Result := '整';
      end; { fZsLeft }
    { ---------------------end------------------------ }begin
      if mFloat <> 0 then begin
        Str(mFloat:0:2, sTemp);
        lStr := fZsLeft(StrLeft(sTemp, '.'));
        rStr := fZsRight(StrRight(sTemp, '.'));
        Result := Iif(lStr = cCnNumCodeUp['0'], '', lStr + cCnMoneyCode[eMUCYuan])
                + rStr;
      end
      else Result := cCnNumCodeUp['0'] + cCnMoneyCode[eMUCYuan] + '整';
    end; { ZsAToC }procedure TForm1.Button1Click(Sender: TObject);
    begin
      Caption := AToC(StrToFloatDef(Edit1.Text, 0));
    end;end.