📄 mainformunit.pas
字号:
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 + -