哪里有金额的大小写转换程序?能告诉我吗?谢谢
解决方案 »
- 突然发现少了许多乐趣
- Free Pascal 内存和端口操作问题
- 调用chm帮助文件问题
- SPCOMM一个非常奇怪的问题?
- 请问用DELPHI 开发游戏 或 手机 这类的系统 好吗 好象多是用 C++ 可是自己对C++不是很熟悉
- IDENTITY的困惑
- 将TClientSocket的Active属性设成True后,直接发送数据包为什么不行?????
- 100分求救!dbexpress + mssql2k,exe文件在自己的机器上能运行,在别的机器上不行。
- wise制作安装程序
- 谁帮我拼个字符串??
- StringGrid中如何使其中几列或行不可编缉
- 怎样给用Rave设计好的RvProject1\report1\page1\中的Text Component的text属性赋值?在线等待...立即结贴!
SmallMonth,BigMonth:string;
wei1,qianwei1:string[2];
qianwei,dianweizhi,qian:integer;
pre0 :integer;
begin {------- 修改参数令值更精确 -------}
qianwei:=-2;{小数点后的位置,需要的话也可以改动-2值}
Smallmonth:=formatfloat('0.00',small);{转换成货币形式,需要的话小数点后加多几个零}
dianweizhi :=pos('.',Smallmonth);{小数点的位置}
BigMonth := '';
pre0 := 1;
for qian:=length(Smallmonth) downto 1 do{循环小写货币的每一位,从小写的右边位置到左边}
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; case qianwei of{判断大写位置,可以继续增大到real类型的最大值}
-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;
if wei1='零' then
begin
if (BigMonth<>'') and (pre0 = 0) then
begin
if qianwei = 0 then
BigMonth := qianwei1+BigMonth
else
BigMonth :=wei1+BigMonth;
end;
if (BigMonth='') and (pre0 = 0) then
BigMonth :=qianwei1+'整';
if (qianwei mod 4 =0) and (qianwei>0) then
BigMonth := qianwei1+BigMonth;
pre0 := 1;
end
else
begin
BigMonth :=wei1+qianwei1+BigMonth;{组合成大写金额}
pre0 := 0;
end; inc(qianwei);
end
else
pre0:=0; if copy(BigMonth,length(BigMonth)-1,2)='元' then
BigMonth:=BigMonth+'整' ;
SmallTOBig:=BigMonth;
end;end;
我很想要,能给我发过来吗?
[email protected]
function xd(xx:currency):string; var dx,ws:string; i,cd:integer; int:currency; begin int:=trunc((abs(xx)+0.005)*100); {在“厘”上4舍5入后去掉小数点} cd:=length(currtostr(int)); {取得数字的长度,跟据此长度即可判断位数} dx:='零壹贰叁肆伍陆柒捌玖'; ws:='分角元拾佰仟万拾佰仟亿拾佰仟'; {位数} Result:= ' '; i:=1; while i<=cd do begin Result:=Result+copy(dx,strtoint(copy(currtostr (int),i,1))*2+1,2); {取数字的大写} Result:=Result+copy(ws,(cd-i)*2+1,2); {加上数字的位数} i:=i+1; end end 在这里输入xd(1234567.89),返回“壹佰贰拾叁万肆仟伍佰陆拾柒元捌角玖分”,但它并不完美,例如xd(100),返回的却是:壹佰零拾零元零角零分(应是壹佰元整),显然这不符合财务工作的实际要求。中文大写的特殊性关键在对“0”的处理上,我们编程的思路也是如此,程序中遇到0的时候并不能简单地用大写“零”来代替,要进行如下判断:是否是第一个零(即它的左边是否不为零)?如是第一个零,还要判断,它的后面是否全为零(这要分段判断:亿以上,万以上亿以下,元以上万以下,分以上元以下)?如不是,才能以大写零来代替;如果是就直接写上位数如万(例如:100000,就应是壹拾万,而不是壹拾零万)。另一方面如果它的后面不全为零,却有连续的零,也要注意(例如:1001,就应是壹仟零壹元,而不是壹仟零零壹元)。 以下就是根据这一思路给出的程序(此程序最大可转换至千亿位,在实际工作中也应该足够了): …… while i<=cd do begin if copy(currtostr(int),i,1)<> '0' then begin Result:=Result+copy(dx,strtoint(copy(currtostr(int),i,1))*2+1,2); Result:=Result+copy(ws,(cd-i)*2+1,2); ling:=false; i:=i+1; end else if ling=false and (copy(currtostr(int),i,1)= '0' ) then {遇到第一个0} begin if cd-i+1>10 then {判断是否是亿以上} begin w:=0; for q:=11 to cd-i+1 do begin w:=w+strtoint(copy(currtostr(int),cd-q+1,1)); end ; if w=0 then {整亿,即亿位有0或连续的0} begin Result:=Result+'亿'; i:=cd-9; end else {非整亿,即亿位无0} begin Result:=Result+'零'; i:=i+1; ling:=true; end; end else if cd-i+1>6 then {判断是否是万以上} …… {判断是否是元以上} …… {判断是否是分以上} begin w:=0; for q:=1 to cd-i+1 do begin w:=w+strtoint(copy(currtostr(int),cd-q+1,1)); end ; if w=0 then begin Result:=Result+'整'; i:=cd+1 ; end else begin Result:=Result+'零'; i:=i+1; ling:=true; end; end; end else if (copy(currtostr(int),i,1)= '0') and (ling=true) then {遇到一个连续的0,跳过} begin i:=i+1; end; end; if xx<0 then Result:= '负'+Result; {判断是否为负数} end; 以上程序在Windows 2000(Windows 98)+Delphi 6中调试通过。
const
d='零壹贰叁肆伍陆柒捌玖分角元拾佰仟万拾佰仟亿';
var
m,k:string;
j:integer;
tmp : integer;
begin
k:='';
m:=floattostr(int(i*100));
j := length(m);
tmp := (strtoint(m[Length(m)-j+1])+1)*2-1;
showmessage(d[(10+j)*2-1]+d[(10+j)*2]);
showmessage(d[(strtoint(m[Length(m)-j+1])+1)*2-1]);
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;