去掉人民币形式中多余的零(50分) (0分)

  • 主题发起人 web_lance
  • 开始时间
W

web_lance

Unregistered / Unconfirmed
GUEST, unregistred user!
例如:
function NumToRMB(Num: Real;
CutZero: Boolean): ShortString;
const
RMB = '零壹贰叁肆伍陆柒捌玖分角元拾佰仟万拾佰仟亿';
var
Spot: ShortString;
I: Integer;
begin
Result := '';
Spot := IntToStr(Round(Num * 100));
if CutZero then
begin
???
end
else
begin
for I := Length(Spot)do
wnto 1do
begin
Result := Result + RMB[(StrToInt(Spot[Length(Spot) - I + 1]) + 1) * 2 - 1]
+ RMB[(StrToInt(Spot[Length(Spot) - I + 1]) + 1) * 2]
+ RMB[(10 + I) * 2 - 1] + RMB[(10 + I) * 2];
end;
end;
end;

输出:80000120.00 → 捌仟零佰零拾零万零仟壹佰贰拾零元零角零分 → 捌仟万零壹佰贰拾元
就如何用比较精简的语句实现题意,请各位大富翁各抒己见!
(请贴出源代码或E-mail至weblance@163.com,请注明标题。经过对比,语句最精简者独得分数)
 
COPY 函数
 
copy(floattostr(RMB), 1, pos('.',floattostr(RMB))-1 );
 
liwens:
  可否考虑下数位及零的取舍问题?
 
Function TfrMyFunctionLibrary.NumtoChi(number:double):string;
var dxje,obz:string;
numbertostr,ZorF,Dxzm,Dwmc:string;
dx,sz,dw,hz,x1,x2:string;
lenth,i,j,code,k,m:integer;
begin
dxje:='';
i:=0;k:=0;m:=0;lenth:=0;
number:=number*100;
if number<>0 then
begin
numbertostr:=floattostrf(number,ffFixed,10,0);
numbertostr:=trim(numbertostr);
if copy(numbertostr,1,1)='-' then
begin
Delete(numbertostr,1,1);
ZorF:='欠';
end
else
ZorF:='';
Dwmc:='分角元拾佰仟万拾佰仟亿拾佰仟';
Dxzm:='零壹贰叁肆伍陆柒捌玖';
lenth:=length(numbertostr);
while lenth>0do
begin
inc(k);
m:=k*2-1;
sz:=copy(numbertostr,lenth,1);
val(sz,j,code);
i:=j*2+1;
hz:=copy(dxzm,i,2);
dw:=copy(dwmc,m,2);
dxje:=hz+dw+dxje;
dec(lenth);
end;
obz:=' ';
dxje:=dxje+' ';
while Length(dxje)>2do
begin
x1:=copy(dxje,1,4);
x2:=copy(x1,3,2);
dxje:=copy(dxje,5,length(dxje)-4);
if copy(x1,1,2)<>'零' then
begin
dx:=dx+x1;
obz:=' ';
end
else
if obz=' ' then
if (x2<>'元') and (x2<>'万') and (x2<>'亿') and (x2<>'分') then
begin
dx:=dx+'零';
obz:='1';
end
else
begin
if x2<>'分' then
dx:=dx+x2;
obz:=' ';
end
else
if (x2='元') or (x2='万') or (x2='亿') then
begin
if (copy(dx,length(dx)-3,2)='亿') and (x2='万') then
dx:=copy(dx,1,length(dx)-2)
else
dx:=copy(dx,1,length(dx)-2)+x2;
obz:=' ';
end
else
if x2='分' then
dx:=copy(dx,1,length(dx)-2);
end;
dx:=trim(dx);
if copy(dx,length(dx)-1,2)='元' then
dx:=dx+'整';
end
else
if number=0 then
dx:='零';
result:=ZorF+dx;
end;
 
你使用上面的代码可以帮你解决问题. 你不需自己再写代码. OK? 如果没有问题.把分下来. 我也要提问题.要分. :)
 
To zhanggx:
  我系提问中亦有例子可以实现我的要求,我之所以提问,系希望集众人之力,揾到個比较好嘅方案。我个人觉得呢个人民币大写转换嘅问题系会计应用方面都几普遍,但系好似都仲没有一個乜嘢标准出过嚟(可能系我见识少啦)。
  zhanggx,在我呢张贴,你系第一个贴出代码嘅,咁快就叫我俾分,是否言之过早呢?
  不过你放心,只要经过对比,如果你嘅方案喺呢度系最好嘅话(各位路过嘅朋友可作见证),我一定会实现自己的承诺。
 
to 楼主,让程序自动去掉人民币形式中多余的零? 难到上面的你没有试过吗?代码 ! 试一试能达到你的目的不? 你用来作什么的? 其实这种没有什么几种方案! 很简单的东西. 只要按照中国人的习惯就行了! 至于你自己上面写的代码一般人是不会用了.怎么可能转换过来还有零呢.这不是笑话给人. 中国人不是这种习惯吧! 至于那个后面带有零一般数据库都不会这样显示的,没有数的话数据库一般不会加显零的.而到报表中它只是显示的格式可以这样而已. 如JE NUMBER(5,2) JE=23 那数据库中只会显示23 而不会是23.00 ,如果你是字转换过来的23.00那么你先转换成DOUBLE型就变成了23了. 你认为呢! 事实上我在这应用于电力发票等用了很多, 没有遇到你好上面那种方式
 
我也认为在调用转换函数前去调0比在转换时去掉零更好
 
To zhanggx、Writer:
  100000789.01 → 壹亿零仟零佰零拾零万零仟柒佰捌拾玖元零角壹分
但工商系要求 → 壹亿零柒佰捌拾玖元零壹分
  而zhanggx兄的函数系将所有的零都去掉。
  我之所以出呢贴,本意系想揾到個更好的方案,如果只系为咗個结果,我又何必出呢贴呢?唔通我真系 吃饱了撑着,嫌分多呀!
 
to 楼主.
呵呵原来楼主是这样呀!我想楼主肯定没有用我的代码去测试,你是光看不测的? 我的可以实现你想要的!
你测试看看.你可以用DELPHI做一个小工程,把上面做成一个还数, 试试看.我试过的,我的是可以的,
 
To zhanggx:
  嘢可以乱食,话唔好乱讲喎!
  喺发贴之前,我前后试著三次。虽然量唔系好多,但系我发现好似有啲BUG啵。Panel1.Caption := NumtoChi(100000789.01) → 运行结果系:壹佰亿柒仟捌佰玖拾元壹角
不过好像個结果应该系:壹亿零柒佰捌拾玖元零壹分 先啱喎。
唔知我有冇用错呢,如果错咗,请zhanggx兄多多指教。
 
TO 楼主, 你有E-MAIL吗? 我发给你我这边的图片, 我这里是没有问题的.不知道是否你那搞错了是不? 我的zhanggx@spinfo.com.cn
 
To zhanggx:
E-mail Add.:weblance@163.com
 
Function TForm1.NumtoChi(number:double):string;
var dxje,obz:string;
numbertostr,ZorF,Dxzm,Dwmc:string;
dx,sz,dw,hz,x1,x2:string;
lenth,i,j,code,k,m:integer;
begin
dxje:='';
i:=0;k:=0;m:=0;lenth:=0;
number:=number*100;
if number<>0 then
begin
numbertostr:=floattostrf(number,ffFixed,15,0);
numbertostr:=trim(numbertostr);
if copy(numbertostr,1,1)='-' then
begin
Delete(numbertostr,1,1);
ZorF:='欠';
end
else
ZorF:='';
Dwmc:='分角元拾佰仟万拾佰仟亿拾佰仟';
Dxzm:='零壹贰叁肆伍陆柒捌玖';
lenth:=length(numbertostr);
while lenth>0do
begin
inc(k);
m:=k*2-1;
sz:=copy(numbertostr,lenth,1);
val(sz,j,code);
i:=j*2+1;
hz:=copy(dxzm,i,2);
dw:=copy(dwmc,m,2);
dxje:=hz+dw+dxje;
dec(lenth);
end;
obz:=' ';
dxje:=dxje+' ';
while Length(dxje)>2do
begin
x1:=copy(dxje,1,4);
x2:=copy(x1,3,2);
dxje:=copy(dxje,5,length(dxje)-4);
if copy(x1,1,2)<>'零' then
begin
dx:=dx+x1;
obz:=' ';
end
else
if obz=' ' then
if (x2<>'元') and (x2<>'万') and (x2<>'亿') and (x2<>'分') then
begin
dx:=dx+'零';
obz:='1';
end
else
begin
if x2<>'分' then
dx:=dx+x2;
obz:=' ';
end
else
if (x2='元') or (x2='万') or (x2='亿') then
begin
if (copy(dx,length(dx)-3,2)='亿') and (x2='万') then
dx:=copy(dx,1,length(dx)-2)
else
dx:=copy(dx,1,length(dx)-2)+x2;
obz:=' ';
end
else
if x2='分' then
dx:=copy(dx,1,length(dx)-2);
end;
dx:=trim(dx);
if copy(dx,length(dx)-1,2)='元' then
dx:=dx+'整';
end
else
if number=0 then
dx:='零';
result:=ZorF+dx;
end;
 
to 楼主,不好意思呀.我看了代码,原来是上面限死了10位. 我把大加长了就没有问题.你请使用, 呵呵. 对不起呀.搞得你罗索挺大的. 因为我没有测试大数字.
 
如果冇更好的贴子贴出,咁我听日就开张新贴。zhanggx,到时你入嚟领分啦!
 
呵呵, 多谢多谢WEB_LANCE 你用什么输入法能打出上面的白话字.
 
To zhanggx:
  系智能五笔吖。
  我已经新开咗一贴,http://www.delphibbs.com/delphibbs/dispq.asp?lid=2585606
  标题系“古老嘅问题--人民币大写转换 ”。
 
只有10行的大写金额转换程序
function NumToChar(n:Real): wideString;
//可以到万亿,并可随便扩大
const
cNum:WideString='零壹贰叁肆伍陆柒捌玖-万仟佰拾亿仟佰拾万仟佰拾元角分';
cCha:array[0..1, 0..11]of string =
(( '零仟','零佰','零拾','零零零','零零','零亿','零万','零元','亿万','零角','零分','零整'),
( '零','零','零','零','零','亿','万','元','亿','零','整','整'));
var
i :Integer;
sNum :WideString;
begin
result :='';
sNum := FormatFloat('0',n*100);
for i := 1 to Length(sNum)do
result := result + cNum[ord(sNum)-47] + cNum[26-Length(sNum)+i];
for i:= 0 to 11do
//去掉多余的零
result := StringReplace(result, cCha[0,i], cCha[1,i], [rfReplaceAll]);
end;
 

Similar threads

I
回复
0
查看
612
import
I
I
回复
0
查看
632
import
I
I
回复
0
查看
751
import
I
I
回复
0
查看
558
import
I
I
回复
0
查看
593
import
I
顶部