function My_StrToRMB(curs: string) :string ;
var
daxie,danwei,minuscurs:string;
i,j,deccount :integer ;
rmb :int64;
begin
curs:=trim(curs);
if (curs='-') or (curs='.') or (curs='') then
// '.','-',''错
begin
result:='ERROR';
exit;
end;
deccount :=0;
for i:=1 to length(curs)do
begin
if not (curs in ['0'..'9','.','-']) then
//'123w2'错
begin
result:='ERROR';
exit;
end;
if (curs='.') and (deccount>0) then
//'12313.324.23'错
begin
result:='ERROR';
exit;
end;
if (curs='-') and (i>1) then
//'-123-123'错
begin
result:='ERROR';
exit;
end;
if curs='.' then
inc(deccount);
end;
rmb:=round(StrToFloat(curs)*100);
minuscurs:='';
//负数标志
if rmb<0 then
begin
minuscurs:='(负数)' ;
rmb:=(-1)*rmb;
end;
if rmb>=1E18 then
//超过9千万亿
begin
result:='ERROR';
exit;
end;
curs:='';
i:=0;
while rmb>0do
begin
j:= rmb mod 10;
case j of
0 : daxie :='零' ;
1 : daxie :='壹' ;
2 : daxie :='贰' ;
3 : daxie :='叁' ;
4 : daxie :='肆' ;
5 : daxie :='伍' ;
6 : daxie :='陆' ;
7 : daxie :='柒' ;
8 : daxie :='捌' ;
9 : daxie :='玖' ;
end;
case i of
0 : danwei :='分' ;
1 : danwei :='角' ;
2 : danwei :='圆' ;
3 : danwei :='拾' ;
4 : danwei :='佰' ;
5 : danwei :='仟' ;
6 : danwei :='万' ;
7 : danwei :='拾' ;
8 : danwei :='佰' ;
9 : danwei :='仟' ;
10 : danwei :='亿' ;
11 : danwei :='拾' ;
12 : danwei :='佰' ;
13 : danwei :='仟' ;
14 : danwei :='万' ;
15 : danwei :='拾' ;
16 : danwei :='佰' ;
17 : danwei :='仟' ;
end;
rmb:=rmb div 10;
if j<>0 then
curs:=daxie+danwei+curs;
//该位上不为0
if (j=0) and (not (i in [2,6,10,14])) then
//该位为0,是一般位
curs:=daxie+curs;
if (j=0) and (i in [2,6,10,14]) then
//该位为0,是敏感位
curs:=danwei+curs;
inc(i);
end;
while pos('零零',curs)>0 do
curs:=stringreplace(curs,'零零','零',[]);
curs:=stringreplace(curs,'零圆','圆',[]);
while pos('零万',curs)>0 do
curs:=stringreplace(curs,'零万','万',[]);
//上万亿后可能两个'零万'
curs:=stringreplace(curs,'零亿','亿',[]);
curs:=stringreplace(curs,'角零','角',[]);
if copy(curs,length(curs)-3,4)='圆零' then
//最后两位是圆零.
curs:=stringreplace(curs,'圆零','圆整',[]);
//小数点后
curs:=stringreplace(curs,'亿万','亿',[]);
result:=minuscurs+curs;
自国人接触“数据库”以来,这个函数就被无数人写过,下列代码是否最短、算法是否最合理呢?请指教。
Function NtoC( n0 :Extended) :wideString;
//人民币金额大小写转换函数(如发现更为精简的,请告诉我)
//作者:方小庆(上海) inrm@263.net
Function IIF(b :boolean;
s1,s2 :string):string;
begin
{本函数在VFP和VB里均为内部函数}
if b then
IIF:=s1 else
IIF:=s2;
end;
Const c:WideString = ’零壹贰叁肆伍陆柒捌玖◇分角元拾佰仟万拾佰仟亿拾佰仟万’;
var L,i,n :integer;
Z,a :boolean;
s, st :WideString;
begin
s:= FormatFloat(’0’,n0*100);
L:= Length(s);
Z:= false;
For i:=1 to Ldo
begin
n:= ord( s[L-i+1])-48;// StrToInt( s[L-i+1]);
a:= (i=11)or(i=7)or(i=3)or(i=1);
//亿、万、元、分位
st:=IIF((n=0)and(Z or a), ’’, c[n+1]) //数值
+ IIF((n=0)and(i=1),’整’, //分位为零
IIF((n>0)or a, c[i+11], ’’)) //单位
+ IIF((n=0)and(not Z)and(i>1)and a,’零’,’’) //亿、万、元位为零而千万、千、角位不为零
+ st;
Z:= n=0;
end;
For i:=1 To Length(st)do
If Copy(st,i,2)=’亿万’ then
Delete(st,i+1,1);
//亿位和万位之间都是零时会出现’亿万’
result:= IIF(n0>9999999999999.99, ’溢出’, IIf(n0 = 0, ’零’, st));
end;
这里有两种方法,用delphi写的代码给你了,该怎么处理自己解决。