📄 decimaltoenglish.txt
字号:
{------------------数字转换为英文函数A-------------------------------}
function 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
Nu比mStr:=Floattostr(Num)//如果用formatfloat转换大于1的数,在该数的小数部分很长时容易出现误差。
else
NumStr:=formatfloat('0.000000000000000000',num);//用formatfloat转换纯小数时精度比floattostr高。
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;
}
//分析小数
if dec_str<>'' then
begin
if return='zero' then return:='point' else return:=return+' point';
for digit:=1 to length(dec_str) do
begin
if dec_str[digit]='0' then
return:=return+' zero '
else
return:=return+' '+n[strtoint(dec_str[digit])];
end;
end;
result:=Minus+return;//成功
end;//转换结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -