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

📄 mainformunit.~pa

📁 <数字转换汉字大写和英文读法的几个函数> 很早以前写的一个数字转换汉字大写和英文读法的几个函数,02年还修改过,可应用于delphi和Powerbuider,有兴趣的朋友可以改成其他
💻 ~PA
📖 第 1 页 / 共 4 页
字号:
unit MainformUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ExtCtrls, ComCtrls,ShellApi;

type
  TMainform = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet3: TTabSheet;
    Label1: TLabel;
    Edit1: TEdit;
    CheckBox1: TCheckBox;
    PageControl2: TPageControl;
    TabSheet4: TTabSheet;
    TabSheet5: TTabSheet;
    Bevel1: TBevel;
    Label2: TLabel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    Label3: TLabel;
    Memo1: TMemo;
    Label4: TLabel;
    Memo2: TMemo;
    Label5: TLabel;
    Memo3: TMemo;
    Label6: TLabel;
    Memo4: TMemo;
    Label7: TLabel;
    Memo5: TMemo;
    Memo11: TMemo;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    TabSheet2: TTabSheet;
    Memo6: TMemo;
    Button1: TButton;
    function DecimalToChinese(number:Extended;cntype:integer):string;//数字转换汉字函数A
    function DecimalToChineseExt(number:string;cntype:integer):string;//数字转换汉字函数B
    function DecimalToEnglish(num:Extended;Cntype:integer):string;//数字转换英文函数A
    function DecimalToEnglishExt(num:string;cntype:integer):string; //数字转换英文函数B
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Label9Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Mainform: TMainform;

implementation

{$R *.DFM}
{***********************数字转换汉字函数A定义***********************}
function TMainForm.DecimalToChinese(number:Extended;cntype:integer):string;
{
 介绍:参数number为Extended类型
 cntype=0:转换为人民币大写格式
 cntype=1:转化为数字大写格式
 例如:DecimalToChinese(45092034.541,0)  :'肆仟伍佰零玖万贰仟零叁拾肆元伍角肆分
       DecimalToChinese(45092034.541,1)  :'肆仟伍佰零玖万贰仟零叁拾肆点伍肆壹
 注意:1.Number参数大小不超过999999999999999.0 (15位整数)
       2.Number参数的位数(包括整数和小数全部位数,不包含小数点)
         不要超过15位 因为程序中使用了Floattostr函数,其返回精度只有15位
         如果Number小于1,精度有18位
 否则返回的转换值有误差或者无法转换而提示错误
}
var
  numstr:array[1..12] of string;//中文数位名
  str1,str2,intstr,decstr:string;//整数部分,小数部分,大写整数部分,大写小数部分
  num:array[1..10] of string;//各个数位段,即每四位为一段
  n:array[1..10] of string;//各位数字
  number1,number2,number3:string;//定义数字的三个数位段
  decpos:integer;
  NumHead:string;//正负性
  NumberName:string;//用于代替参数Number的字符串
begin
  if (Cntype<>0) and (CnType<>1) then begin
   showmessage('类型参数错误');
   result:='';
   exit;
  end;
  {初始化}
  numstr[1] :='零';
  numstr[2] :='壹';
  numstr[3] :='贰';
  numstr[4] :='叁';
  numstr[5] :='肆';
  numstr[6] :='伍';
  numstr[7] :='陆';
  numstr[8] :='柒';
  numstr[9] :='捌';
  numstr[10]:='玖';
  numstr[11]:='拾';
  str1:='';
  str2:='';
  intstr:='';
  decstr:='';
  NumHead:='';
  if Number<0 then  begin //如果是负数,则在前面加‘负'
     NumHead:='负';
     Number:=-Number;
  end;
  //将数字转换为字符
  try
    if Number>1 then
      NumberName:=Floattostr(Number)
    else
      NumberName:=formatfloat('0.000000000000000000',number);
    if Cntype=0 then
      NumberName:=formatfloat('0.00',number);//得到字符型数字格式,并四舍五入
  except
    on e:EConvertError do begin
      Showmessage('非法浮点数') ;
      result:='';
      exit;
      end;
  end;
  //分析出整数部分和小数部分
  if Pos('.',NumberName)>0 then begin
    str1:=copy(NumberName,1,Pos('.',NumberName)-1);//取整数部分
    str2:=copy(NumberName,Pos('.',NumberName)+1,Length(NumberName)-Pos('.',NumberName));//取小数部分
  end else begin
    Str1:=NumberName;
    Str2:=''
  end;
  //整理没有用的0字符
  while Copy(Str1,1,1)='0' do Str1:=Copy(Str1,2,Length(Str1)-1);//去掉整数前面的0
  if Str1='' then str1:='0';
  while copy(str2,Length(Str2),1)='0' do Str2:=Copy(Str2,1,Length(str2)-1);//去掉小数部分的尾零
  if (pos('e',str1+str2)>0) or (pos('E',str1+str2)>0) then begin
    Showmessage('输入数字超出精度,不能转换!');
    Result:='';
    exit;
  end;
  {*****分析转换整数部分*****}
  {分析整数部分在100000000以上的}
  if length(str1)>8 then
   begin
     //按每4位为一段拆分成三段,逐段分析
     num[1]:=copy(str1,1,length(str1)-8);//取8位以上的那部分数段
     num[2]:=copy(str1,length(str1)-7,4);//取千万到万的4位
     num[3]:=copy(str1,length(str1)-3,4);//取千到个位的4位
     number1:=DecimalToChinese(strtofloat(num[1]),1)+'亿';//通过函数嵌套调用,得到亿上的数段格式,即若干亿

     if strtoint(Num[2])=0 then//如果千万到万4位为0
     begin
       if strtoint(Num[3])=0 then//并且末尾4位为0
        Number2:=''//没有内容
       else
       begin
        if strtoint(Num[3])<1000 then
         Number2:=''//如果第三段也是零XX百十个,则中间段的"零"去掉
        else
         Number2:=numstr[1];//读零
       end;
     end
     else
     begin
       if strtoint(num[2])>1000 then //中间4位大于1000
        Number2:=DecimalToChinese(strtoint(num[2]),1)+'万'
       else
        Number2:=numStr[1]+DecimalToChinese(strtoint(num[2]),1)+'万';//不足一千万,则读X亿零xx百、十、万
     end;
     if strtoint(Num[3])=0 then//末尾4位为0
      Number3:=''
     else
     begin
       if strtoint(num[3])>1000 then//末尾4位大于1000
        Number3:=DecimalToChinese(strtoint(num[3]),1)
       else
        Number3:=numstr[1]+DecimalToChinese(strtoint(num[3]),1);//不足一千,则读X万零XX百、十
     end;
     intstr:=number1+number2+number3;
   end;

   {分析整数部分在10000~99999999之间的}
  if (length(str1)>=5) and (length(str1)<=8) then
    begin
     //拆分为两段
     num[1]:=copy(str1,1,length(str1)-4);//取得第一段(千万位到万位)
     //为方便分析,若不足4位,用'0'补齐为4位
     if length(num[1])=3 then
      num[1]:='0'+num[1];
     if length(num[1])=2 then
      num[1]:='00'+num[1];
     if length(num[1])=1 then
      num[1]:='000'+num[1];
     num[2]:=copy(str1,length(str1)-3,4);//取得第二段(千位到个位)
     number1:=DecimalToChinese(strtoint(num[1]),1)+'万';
     if strtoint(num[2])=0 then
      number2:=''
     else
      begin
       if strtoint(num[2])>1000 then //中间4位大于1000
        Number2:=DecimalToChinese(strtoint(num[2]),1)
       else
        Number2:=numStr[1]+DecimalToChinese(strtoint(num[2]),1);//零若干百十
      end;
     intstr:=number1+number2;
   end;
  {分析整数部分不到10000的}
  if length(str1)<5 then
    begin
     num[1]:=str1;
     //不足4位,用'0'补齐
     if length(num[1])=3 then
      num[1]:='0'+num[1];
     if length(num[1])=2 then
      num[1]:='00'+num[1];
     if length(num[1])=1 then
      num[1]:='000'+num[1];
     number1:='';//亿以上的为空
     number2:='';//万以上的为空
     //分析千位
     if copy(num[1],1,1)='0' then
      n[1]:=''     //千位为0,千位字符空
     else
      n[1]:=numstr[strtoint(copy(num[1],1,1))+1]+'仟';
     //分析百位
     if copy(num[1],2,1)='0' then //百位为0,
      begin
       if copy(num[1],1,1)='0' then //且千位为0,
        n[2]:=''  //百位字符为空
       else
        n[2]:=numstr[1] //百位字符为‘零’
      end
     else
      n[2]:=numstr[strtoint(copy(num[1],2,1))+1]+'佰';

     //分析十位
     if copy(num[1],3,1)='0' then
      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//将数字字串转换为人民币的大写格式

⌨️ 快捷键说明

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