⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainformunit.pas

📁 <数字转换汉字大写和英文读法的几个函数> 很早以前写的一个数字转换汉字大写和英文读法的几个函数,02年还修改过,可应用于delphi和Powerbuider,有兴趣的朋友可以改成其他
💻 PAS
📖 第 1 页 / 共 4 页
字号:
      begin
       if copy(num[1],2,1)='0' then
        n[3]:=''
       else
        n[3]:=numstr[1]
      end
     else
      begin
       if (copy(num[1],1,1)='0') and (copy(num[1],2,1)='0') and (copy(num[1],3,1)='1') then//如果百位为0且十位为1则不读出壹字
        n[3]:='拾'
       else
        n[3]:=numstr[strtoint(copy(num[1],3,1))+1] +'拾';
      end;

     //分析个位
     if copy(num[1],4,1)='0' then
      n[4]:=''
     else
      n[4]:=numstr[strtoint(copy(num[1],4,1))+1];

     //
     if copy(num[1],length(num[1])-2,3)='000' then//当末尾有000时
      begin
       n[2]:='';
       n[3]:='';
       n[4]:=''
      end;
     if copy(num[1],length(num[1])-1,2)='00' then//当末尾有00时
      begin
       n[3]:='';
       n[4]:=''
      end;
     if copy(num[1],length(num[1]),1)='0' then//当末尾有0时
      n[4]:='';
     //数段合并
     number3:=n[1]+n[2]+n[3]+n[4];
     //取得整数位值
     intstr:=number1+number2+number3;
   end;
  {如果整数为零,转换为"零"}
  if str1='0' then
   intstr:=numstr[1];

  {整数转换完毕}


  {*****分析和转换小数部分*****}
  if length(str2)>0 then //如果小数数段不为空,则分析小数
   begin
    if cntype=0 then{一.如果转换为人民币表达式}
     begin
      //不足2位,用零补足空位
      if length(str2)=1 then  str2:=str2+'0';
      if copy(str2,1,1)='0' then//角为0
       begin
        if Intstr='零' then n[1]:='' else n[1]:='零';//如果元为0,则不读0角,否则读零若干分
       end
      else
       n[1]:=numstr[strtoint(copy(str2,1,1))+1]+'角';
      if copy(str2,2,1)='0' then
       n[2]:=''
      else
       n[2]:=numstr[strtoint(copy(str2,2,1))+1]+'分';
      decstr:=n[1]+n[2];
     end
    else //二.如果转换为数字表达式
     begin
      decstr:='';
      for decpos:=1 to length(str2) do
       begin
        decstr:=decstr+numstr[strtoint(copy(str2,decpos,1))+1];
       end;
     end;
   end;
  {小数转换完毕}
  {输出本函数的结果***********************}
  if cntype=0 then//将数字字串转换为人民币的大写格式
   begin
    if str2='' then//如果为纯整数
     result:=NumHead+intstr+'元整'
    else
     begin
      if intstr='零' then//如果整数为零,就只显示小数
       result:=NumHead+decstr
      else
       result:=NumHead+intstr+'元'+decstr
     end;
   end;
  if cntype=1 then//将数字字串转换为普通大写格式
   begin
    if str2='' then//如果为纯整数
     result:=NumHead+intstr
    else
     result:=NumHead+intstr+'点'+decstr
   end;
  {转换完毕}
end;

{------------------数字转换为英文函数A-------------------------------}
function TMainForm.DecimalToEnglish(num:Extended;Cntype:integer):string;
{
 Cntype:0--通用格式(最高数位Million百万)
         1--美式格式(最高数位Trillion万亿)
         2--英式格式(最高数位Trillion百亿亿)
 注意:1.Number参数大小不超过999999999999999.0 (15位整数)
       2.Number参数的位数(包括整数和小数全部位数,不包含小数点)
         不要超过15位 因为程序中使用了Floattostr函数,其返回精度只有15位
         如果Number小于1,精度有18位
 否则返回的转换值有误差或者无法转换而提示错误
}
var int_str,dec_str:string;//整数部分和小数部分
    numstr:string;
    n:array[0..90] of string;
    return:string;
    digit:integer;
    Minus:string;
begin
      if (Cntype<>0) and (CnType<>1) and (CnType<>2) then begin
        showmessage('类型参数错误');
        result:='';
        exit;
      end;
      return:='';//初始化结果字符
      //初始化关键字
      n[0]:='Zero';n[6]:='Six';n[12]:='Twelve';n[18]:='Eighteen';
      n[1]:='One';n[7]:='Seven';n[13]:='Thirteen';n[19]:='Nineteen';
      n[2]:='Two';n[8]:='Eight';n[14]:='Fourteen';n[20]:='Twenty';
      n[3]:='Three';n[9]:='Nine';n[15]:='Fifteen';
      n[4]:='Four';n[10]:='Ten';n[16]:='Sixteen';
      n[5]:='Five';n[11]:='Eleven';n[17]:='Seventeen';
      n[30]:='Thirty';n[50]:='Fifty';n[70]:='Seventy';n[90]:='Ninety';
      n[40]:='Forty';n[60]:='Sixty';n[80]:='Eighty';
      Minus:='';
      if num<0 then
      begin
        Num:=-Num;
        Minus:='Minus ';
      end;
  //将数字转换为字符
  try
    if Num>1 then
      NumStr:=Floattostr(Num)
    else
      NumStr:=formatfloat('0.000000000000000000',num);
  except
    on e:EConvertError do begin
      Showmessage('非法浮点数') ;
      result:='';
      exit;
      end;
  end;
  //分析出整数部分和小数部分
  if Pos('.',NumStr)>0 then begin
    Int_Str:=copy(NumStr,1,Pos('.',NumStr)-1);//取整数部分
    Dec_Str:=copy(NumStr,Pos('.',NumStr)+1,Length(NumStr)-Pos('.',NumStr));//取小数部分
  end else begin
    Int_Str:=NumStr;
    Dec_Str:=''
  end;
  //整理没有用的0字符
  while Copy(Int_Str,1,1)='0' do Int_Str:=Copy(Int_Str,2,Length(Int_Str)-1);//去掉整数前面的0
  if Int_Str='' then Int_Str:='0';
  while copy(Dec_str,Length(Dec_str),1)='0' do Dec_str:=Copy(Dec_str,1,Length(Dec_str)-1);//去掉小数部分的尾零
  if (pos('e',Int_str+Dec_str)>0) or (pos('E',Int_str+Dec_str)>0) then begin
    Showmessage('输入数字超出精度,不能转换!');
    Result:='';
    exit;
  end;

      //开始分析整数部分
      if length(int_str)<=3 then//分析只有一~三位数的情况
      begin
        if int_str='0' then//等于0
           return:='zero'
        else
        begin
         if strtoint(int_str)<=20 then
         begin//小于等于20
          return:=n[strtoint(int_str)];//直接读取名称
         end
         else
         begin
           if strtoint(int_str)<100 then//小于100
           begin
                 if int_str[2]='0' then//整十
                       return:=n[strtoint(int_str)]
                 else
                       return:=n[strtoint(int_str[1]+'0')]+' '+n[strtoint(int_str[2])];//组合几十几
           end;
         end;
         if strtoint(int_str)>=100 then//大于100
         begin
                if (int_str[2]='0') and (int_str[3]='0') then
                    return:=n[strtoint(int_str[1])]+' Hundred'
                else
                    return:=n[strtoint(int_str[1])]+' Hundred and '+DecimalToEnglish(strtoint(int_str[2]+int_str[3]),0);
         end;
        end;
      end;

      if (length(int_str)>=4) and (length(int_str)<=6) then//分析有四~六位数的情况
      begin
        if copy(int_str,length(int_str)-2,3)='000' then//后面全是0
         return:=decimalToEnglish(strtoint(copy(int_str,1,length(int_str)-3)),0)+' Thousand'
        else
        begin
           if copy(int_str,length(int_str)-2,1)='0' then//百位为0,加and
            return:=decimalToEnglish(strtoint(copy(int_str,1,length(int_str)-3)),0)+' Thousand and '+decimalToEnglish(strtoint(copy(int_str,length(int_str)-2,3)),0)
           else
           begin
            if copy(int_str,length(int_str)-1,2)='00' then//是整百,加and
             return:=decimalToEnglish(strtoint(copy(int_str,1,length(int_str)-3)),0)+' Thousand and '+decimalToEnglish(strtoint(copy(int_str,length(int_str)-2,3)),0)
            else
             return:=decimalToEnglish(strtoint(copy(int_str,1,length(int_str)-3)),0)+' Thousand '+decimalToEnglish(strtoint(copy(int_str,length(int_str)-2,3)),0);
           end;
        end;
      end;

      if (length(int_str)>=7) and ((length(int_str)<=9)) then//分析七~九位数的情况
      begin
        if copy(int_str,length(int_str)-5,6)='000000' then//如果后面6位全是0
         return:=decimaltoenglish(strtoFloat(copy(int_str,1,length(int_str)-6)),0)+' Million'
        else
        begin
          return:=decimaltoenglish(strtoFloat(copy(int_str,1,length(int_str)-6)),0)+' Million,'+decimaltoEnglish(strtoFloat(copy(int_str,length(int_str)-5,6)),0);
        end;
      end;

      if (length(int_str)>=10) and ((length(int_str)<=12)) then//分析十~十二位数的情况
      begin
       case Cntype of
       0://普通格式
         begin
          if copy(int_str,length(int_str)-5,6)='000000' then//如果后面6位全是0
           return:=decimaltoenglish(strtoFloat(copy(int_str,1,length(int_str)-6)),0)+' Million'
          else
          begin
            return:=decimaltoenglish(strtoFloat(copy(int_str,1,length(int_str)-6)),0)+' Million,'+decimaltoEnglish(strtoFloat(copy(int_str,length(int_str)-5,6)),0);
          end;
         end;
       1://美式格式
         begin
          if copy(int_str,length(int_str)-8,9)='000000000' then//如果后面9位全是0
           return:=decimaltoenglish(strtoFloat(copy(int_str,1,length(int_str)-9)),0)+' Billion'
          else
           return:=decimaltoenglish(strtoFloat(copy(int_str,1,length(int_str)-9)),0)+' Billion,'+decimaltoenglish(strtoFloat(copy(int_str,length(int_str)-8,9)),1);
         end;
       2://英式格式
         begin
          if copy(int_str,length(int_str)-8,9)='000000000' then//如果后面9位全是0
           return:=decimaltoenglish(strtoFloat(copy(int_str,1,length(int_str)-9)),0)+' Milliard'
          else
           return:=decimaltoenglish(strtoFloat(copy(int_str,1,length(int_str)-9)),0)+' Milliard,'+decimaltoenglish(strtoFloat(copy(int_str,length(int_str)-8,9)),2);
         end;
       end;
      end;

      if (length(int_str)>=13) and ((length(int_str)<=18)) then//分析十三~十八位数的情况
      begin
       case Cntype of
       0://普通格式
         begin
          if copy(int_str,length(int_str)-5,6)='000000' then//如果后面6位全是0
           return:=decimaltoenglish(strtoFloat(copy(int_str,1,length(int_str)-6)),0)+' Million'
          else
          begin
            return:=decimaltoenglish(strtoFloat(copy(int_str,1,length(int_str)-6)),0)+' Million,'+decimaltoEnglish(strtoFloat(copy(int_str,length(int_str)-5,6)),0);
          end;
         end;
       1://美式格式
         begin
          if copy(int_str,length(int_str)-11,12)='000000000000' then//如果后面十二位全是0
           return:=decimaltoenglish(strtoFloat(copy(int_str,1,length(int_str)-12)),0)+' Trillion'
          else
           return:=decimaltoenglish(strtoFloat(copy(int_str,1,length(int_str)-12)),0)+' Trillion,'+decimaltoenglish(strtoFloat(copy(int_str,length(int_str)-11,12)),1);
         end;
       2://英式格式
         begin
          if copy(int_str,length(int_str)-11,12)='000000000000' then//如果后面十二位全是0
           return:=decimaltoenglish(strtoFloat(copy(int_str,1,length(int_str)-12)),0)+' Billion'
          else
           return:=decimaltoenglish(strtoFloat(copy(int_str,1,length(int_str)-12)),0)+' Billion,'+decimaltoenglish(strtoFloat(copy(int_str,length(int_str)-11,12)),2);
         end;
       end;
      end;
      {【超出精度不予考虑,一下程序仅做参考,详细见DeciamlToEnglishExt(..)的定义】
      if length(int_str)>18 then//分析十八位数以上的情况
      begin
       case Cntype of
       0://普通格式
         begin
          if strtoFloat(copy(int_str,length(int_str)-5,6))=0 then//如果后面6位全是0
           return:=decimaltoenglish(strtoFloat(copy(int_str,1,length(int_str)-6)),0)+' Million'
          else
          begin
            return:=decimaltoenglish(strtoFloat(copy(int_str,1,length(int_str)-6)),0)+' Million,'+decimaltoEnglish(strtoFloat(copy(int_str,length(int_str)-5,6)),0);
          end;
         end;
       1://美式格式
         begin
          if strtoFloat(copy(int_str,length(int_str)-11,12))=0 then//如果后面十二位全是0
           return:=decimaltoenglish(strtoFloat(copy(int_str,1,length(int_str)-12)),1)+' Trillion'
          else
           return:=decimaltoenglish(strtoFloat(copy(int_str,1,length(int_str)-12)),1)+' Trillion,'+decimaltoenglish(strtoFloat(copy(int_str,length(int_str)-11,12)),1);
         end;
       2://英式格式
         begin
          if strtoint64(copy(int_str,length(int_str)-17,18))=0 then//如果后面十八位全是0
           return:=decimaltoenglish(strtoint64(copy(int_str,1,length(int_str)-18)),2)+' Trillion'
          else
           return:=decimaltoenglish(strtoint64(copy(int_str,1,length(int_str)-18)),2)+' Trillion,'+decimaltoenglish(strtoint64(copy(int_str,length(int_str)-17,18)),2);
         end;
       end;
      end;
      }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -