怎样写数字(金额)转成英文的函数(200分)

F

fwcy

Unregistered / Unconfirmed
GUEST, unregistred user!
本人写了一个数字(金额)转成中文的函数。程序如下。但不知怎样转成英文?
function xTOd(i:Real):string;
const
d='零壹贰叁肆伍陆柒捌玖分角元拾佰仟万拾佰仟亿';
var m,k:string;
j:integer;
begin
k:='';
m:=inttostr(round(i*100));
for j:=length(m) downto 1 do
k:=k+d[(strtoint(m[Length(m)-j+1])+1)*2-1]+
d[(strtoint(m[Length(m)-j+1])+1)*2]+d[(10+j)*2-1]+d[(10+j)*2];
xTOd:=k;
end;
 
转e文麻烦一点
也可以试试
先做几个数组 a[1]:='one', a[2]:='two'.... a[10]:='ten'
a[11]:='eleven' , a[12]:='twleve' ...a[20]:='twenty',a[30]:='thirty'...a[90]:='ninety'
然后计算各个位数的值,千位,百位等
在以位数做数组的下标,加上相应的位数
如果有小数也是同样的道理
能归类写的就归类写,不能归类的就写到数组里
举个例子:
5613
先计算出千位5 a[5]为five 加位数 thousand
再计算出百位6 a[6]为six 加位数 hundred
判断后两位是不是数组中定义过的数 如 1-19 20 30 。。90
如果是就直接以数组中的值加 and 写出来
如果不是 就再计算出 十位 乘以10 在数组中取出相应的值
加 - 在计算出个位 写在最后

我也没试过 应该可以 (就是太麻烦了:)
大家有没有好的方法[:D][:D]
 
如果做好的话
就留一份源码吧
以后就不用麻烦了
:)
 
看一下先
 
TO:智者乐水 你说的容易,但怎么写呀?
 
这个问题好像经常有人提,建议大富翁把一些典型的问题列出来,供来者查询!
 
你的那个数字(金额)转成中文的函数也太糙了。什么零角零元零千的。
我有一个比较好的,改天给你贴上来。
 
TO:憔悴:老兄,不会吧,我这个如是转中文既方便又简单!
我也看过很多人写的但很复杂!
 
function TTestForm.DecimalToEnglishExt(num:string;cntype:integer):string;
var int_str,dec_str:string;//整数部分和小数部分
n:array[0..90] of string;
return:string;
digit:integer;//小数点位置
Minus:string;//数字正负性
Numlen,DecPos:integer;//数字长度,,
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[1]='-' then
begin
Num:=Copy(num,2,length(num)-1);
Minus:='Minus ';
end;
Numlen:=Length(num);//得到数字长度
//去掉前面没有用的0
Decpos:=Numlen;
for digit:=1 to Numlen do begin
if num[digit]<>'0' then begin Decpos:=digit;break;end;
end;
num:=copy(num,Decpos,Numlen-decpos+1);
Numlen:=Length(num);//得到数字长度
//校验Num的数字格式是否有效
//先校验参数number是不是数字格式
//校验是否只有一个小数点
Decpos:=0;
for digit:=1 to Numlen do begin
if Num[digit]='.' then Decpos:=Decpos+1;
end;
if Decpos>1 then begin
showmessage('参数错误:不是数字格式!');
Result:='';
exit;
end;
//校验是否含有非数字和'.'的字母存在
for digit:=1 to Numlen do begin
if Num[digit]='.' then continue;
if (ord(Num[digit])<48) or (ord(Num[digit])>57) then begin
Result:='error';
break;
end;
end;
if Result='error' then begin
showmessage('参数错误:不是数字格式!');
result:='';
exit;
end;
digit:=pos('.',num);//得到小数点位置
//分别得到整数部分和小数部分
if pos('.',num)>0 then
begin
int_str:=copy(num,1,digit-1);
dec_str:=copy(num,digit+1,Numlen-digit);
//消除小数后面多余的0
while copy(Dec_str,length(Dec_str),1)='0' do
Dec_str:=copy(Dec_str,1,length(Dec_str)-1);
if Dec_str='' then Dec_str:='0';
end
else
begin
int_str:=num;
dec_str:='';
end;
//消除整数部分前面的多余的0
while copy(int_str,1,1)='0' do
int_str:=copy(int_str,2,length(int_str)-1);
if int_str='' then int_str:='0';
//***********开始分析整数部分****************
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 '+DecimalToEnglishExt(int_str[2]+int_str[3],0);
end;
end;
end;

if (length(int_str)>=4) and (length(int_str)<=6) then//分析有四~六位数的情况
begin
if strtoint(copy(int_str,length(int_str)-2,3))=0 then//后面全是0
return:=DecimalToEnglishExt(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:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-3),0)+' Thousand and '+DecimalToEnglishExt(copy(int_str,length(int_str)-2,3),0)
else
begin
if copy(int_str,length(int_str)-1,2)='00' then//是整百,加and
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-3),0)+' Thousand and '+DecimalToEnglishExt(copy(int_str,length(int_str)-2,3),0)
else
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-3),0)+' Thousand '+DecimalToEnglishExt(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 strtoint(copy(int_str,length(int_str)-5,6))=0 then//如果后面6位全是0
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-6),0)+' Million'
else
begin
{if pos('and',LowerCase(DecimalToEnglishExt(strtoint(copy(int_str,length(int_str)-5,6)))))=0 then
return:=DecimalToEnglishExt(strtoint(copy(int_str,1,length(int_str)-6)),0)+' Million and '+DecimalToEnglishExt(strtoint(copy(int_str,length(int_str)-5,6)))
else}
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-6),0)+' Million,'+DecimalToEnglishExt(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 strtoint(copy(int_str,length(int_str)-5,6))=0 then//如果后面6位全是0
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-6),0)+' Million'
else
begin
{if pos('and',LowerCase(DecimalToEnglishExt(strtoint(copy(int_str,length(int_str)-5,6)),0)))=0 then
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-6),0)+' Million and '+DecimalToEnglishExt(strtoint(copy(int_str,length(int_str)-5,6)))
else}
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-6),0)+' Million,'+DecimalToEnglishExt(copy(int_str,length(int_str)-5,6),0);
end;
end;
1://美式格式
begin
if strtoint(copy(int_str,length(int_str)-8,9))=0 then//如果后面9位全是0
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-9),0)+' Billion'
else
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-9),0)+' Billion,'+DecimalToEnglishExt(copy(int_str,length(int_str)-8,9),1);
end;
2://英式格式
begin
if strtoint(copy(int_str,length(int_str)-8,9))=0 then//如果后面9位全是0
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-9),0)+' Milliard'
else
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-9),0)+' Milliard,'+DecimalToEnglishExt(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 strtoint(copy(int_str,length(int_str)-5,6))=0 then//如果后面6位全是0
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-6),0)+' Million'
else
begin
{if pos('and',LowerCase(DecimalToEnglishExt(strtoint(copy(int_str,length(int_str)-5,6)),0)))=0 then
return:=DecimalToEnglishExt(strtoint(copy(int_str,1,length(int_str)-6)),0)+' Million and '+DecimalToEnglishExt(strtoint(copy(int_str,length(int_str)-5,6)))
else}
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-6),0)+' Million,'+DecimalToEnglishExt(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:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-12),0)+' Trillion'
else
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-12),0)+' Trillion,'+DecimalToEnglishExt(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:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-12),0)+' Billion'
else
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-12),0)+' Billion,'+DecimalToEnglishExt(copy(int_str,length(int_str)-11,12),2);
end;
end;
end;

if length(int_str)>18 then//分析十八位数以上的情况
begin
case Cntype of
0://普通格式
begin
if strtoint(copy(int_str,length(int_str)-5,6))=0 then//如果后面6位全是0
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-6),0)+' Million'
else
begin
{if pos('and',LowerCase(DecimalToEnglishExt(strtoint(copy(int_str,length(int_str)-5,6)),0)))=0 then
return:=DecimalToEnglishExt(strtoint(copy(int_str,1,length(int_str)-6)),0)+' Million and '+DecimalToEnglishExt(strtoint(copy(int_str,length(int_str)-5,6)))
else}
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-6),0)+' Million,'+DecimalToEnglishExt(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:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-12),1)+' Trillion'
else
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-12),1)+' Trillion,'+DecimalToEnglishExt(copy(int_str,length(int_str)-11,12),1);
end;
2://英式格式
begin
if copy(int_str,length(int_str)-17,18)='000000000000000000' then//如果后面十八位全是0
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-18),2)+' Trillion'
else
return:=DecimalToEnglishExt(copy(int_str,1,length(int_str)-18),2)+' Trillion,'+DecimalToEnglishExt(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;//转换结束
 
简单是简单,但是不方便
试问一亿元零千万零百万零十万……这样的东西怎么能用!
复杂只要是必要的,就必须复杂!
 
同意 憔悴
该复杂的时候就要复杂
(用多种情况么~)
其实那也不叫复杂叫 ~~ 严谨(做程序的基本原则之一~~)
 
TO:pOYSCHE 这个函数怎么调用呢?
 
TO:porsche
老兄:我想在Edit2里输入一个数据,然后要在Edit1里面显示出来英文。
edit1.text:=DecimalToEnglishExt(edit2.text)
但调试通不过!
 
TO:porsche 非常感谢,我已经成功调试通过!200分将全送给你!
但我不知edit1.text:=DecimalToEnglishExt(edit2.text,1)
和edit1.text:=DecimalToEnglishExt(edit2.text,2)有什么区别!
 
TO:porsche 非常感谢,我已经成功调试通过!200分将全送给你!
祝快乐!
 
顶部