在delphi中如何将数字转换成汉字(100分)

  • 主题发起人 gangjialin
  • 开始时间
G

gangjialin

Unregistered / Unconfirmed
GUEST, unregistred user!
在delphi中如何将数字转换成汉字
如将386转换成叁佰八拾六元
 
写一段转换通用代码,用于整个程序中数字的转换
 
这个问题可以这样解决,在KeyPress事件中判断用户输入的数字是多少,然后将其转换成为
相应的汉字.有几个问题要注意,因为一个汉字占用两个字节,所以在转换的时候要为其腾出
两个位子.其中可能要用到SelStart,SelLength等过程或者是函数,自己去写吧!
 
搜索一下吧,这个问题早就有人问过了。
 
转贴:
如下为一个简单的小写金额转换为大写的函数,其思路简单(可以说烂吧,居然利用了位置来转换),
但是它却几乎可以无限制的转换,只要你能读得出来和写得进去:
function Tform1.SmallTOBig(small:real):string;
var SmallMonth,BigMonth:string;
wei1,qianwei1:string[2];
wei,qianwei,dianweizhi,qian:integer;
begin

{------- 修改参数令值更精确 -------}
{小数点后的位数,需要的话也可以改动该值}
qianwei:=-2;

{转换成货币形式,需要的话小数点后加多几个零}
Smallmonth:=formatfloat('0.00',small);
{---------------------------------}
dianweizhi :=pos('.',Smallmonth);{小数点的位置}
{循环小写货币的每一位,从小写的右边位置到左边}
for qian:=length(Smallmonth)do
wnto 1do

begin

{如果读到的不是小数点就继续}
if qian<>dianweizhi then

begin

{位置上的数转换成大写}
case strtoint(copy(Smallmonth,qian,1)) of
1:wei1:='壹';
2:wei1:='贰';
3:wei1:='叁';
4:wei1:='肆';
5:wei1:='伍';
6:wei1:='陆';
7:wei1:='柒';
8:wei1:='捌';
9:wei1:='玖';
0:wei1:='零';
end;

{判断大写位置,可以继续增大到real类型的最大值,可是谁有那么多钱}
case qianwei of
-3:qianwei1:='厘';
-2:qianwei1:='分';
-1:qianwei1:='角';
0 :qianwei1:='元';
1 :qianwei1:='拾';
2 :qianwei1:='佰';
3 :qianwei1:='千';
4 :qianwei1:='万';
5 :qianwei1:='拾';
6 :qianwei1:='佰';
7 :qianwei1:='千';
8 :qianwei1:='亿';
9 :qianwei1:='十';
10:qianwei1:='佰';
11:qianwei1:='千';
end;

inc(qianwei);
BigMonth :=wei1+qianwei1+BigMonth;{组合成大写金额}
end;

end;

SmallTOBig:=BigMonth;
end;

  程序调用如下“edit1.text:=SmallTOBig(1234567890.1234);”他自动默认小数点后两位。
 
我有一个C语言版的,pascal版的不记得丢哪去了,写是写过的,要楼上写的不好用,再说
另,注意386应该转换成叁佰捌拾陆圆整.
AnsiString __fastcall FloatToCurr(double fSum)
{
String sSum="";
bool LastIsZero=false;
bool TheEndIsZero=false;
bool Wang=false;
unsigned __int64 iSumi,iSumr;
String S[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
String R[]={"分","角","圆","拾","佰","仟","万","拾","佰","仟","亿"};
iSumi= __int64((fSum+0.005)*100);
for(int i=0;i<10,iSumi>0;i++)
{
iSumr=iSumi%10;
iSumi/=10;
if(iSumr!=0)
{
LastIsZero=false;
int iIndex = iSumr;
sSum=AnsiString(S[iIndex])+AnsiString(R)+sSum;
if(i==6)Wang=true;
}
else
{
if(i==0)
{
TheEndIsZero=true;
LastIsZero=true;
}
else
{
if(i==2)sSum="圆"+sSum;
else
{
// if(i==3&amp;&amp;iSumi%10!=0) sSum="拾"+sSum;
// if(i==4&amp;&amp;iSumi%10!=0) sSum="佰"+sSum;
// if(i==5&amp;&amp;iSumi%10!=0) sSum="仟"+sSum;
// else
// {
if(!LastIsZero)
{
sSum="零"+sSum;
}
if(i>=6&amp;&amp;!Wang)
{
sSum="万"+sSum;
Wang=true;
}
}
}
LastIsZero=true;
}
}
if(TheEndIsZero)sSum+="整";
return sSum;
}
 
我有比这上面的更好的,可以读16位数据,没有一点Bug
tkggai@sina.com
 
我写过的一段程序,支持到20位,也就是一千亿亿元,符合票据结算的基本规定。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=666998
呵呵,已经靠它赚了200分,你要是费点力气查一下的话,不就能省下100了么
 
希望在提问之前首先搜索一下!!!
不要浪费大家的眼球!!!
 
接受答案了.
 
顶部