本函数由本人十多年前用DBaseIII编写,现用Pascal改编。如发现有错请告诉我,如发现有更为短小精简(当然必须符合财务规定)的,也请告诉我。 人民币金额大小写转换的函数,从国人使用数据库以来就被无数人用无数种算法写过,应该是一个典型的算法问题,但未见有比较权威的、业界公认比较优秀的算法。
//以下函数能将小于十万亿元的小写金额转换为大写 //作者 方小庆(inrm@263.net) Function NtoC(n0 :real) :String; Function IIF(b :boolean; s1,s2:string):string; begin //本函数在VFP和VB中均为系统内部函数 if b then IIF:=s1 else IIF:=s2; end; Const c = '零壹贰叁肆伍陆柒捌玖◇分角圆拾佰仟万拾佰仟亿拾佰仟万'; var L,i,n, code :integer; Z :boolean; s, st,st1 :string; begin s :=FormatFloat( '0.00', n0); L :=Length(s); Z :=n0<1; For i:= 1 To L-3 do begin Val(Copy(s, L-i-2, 1), n, code); st:=IIf((n=0)And(Z Or (i=9)Or(i=5)Or(i=1)), ', Copy(c, n*2+1, 2)) + IIf((n=0)And((i<>9)And(i<>5)And(i<>1)Or Z And(i=1)),',Copy(c,(i+13)*2-1,2)) + st; Z := (n=0); end; Z := False; For i:= 1 To 2 do begin Val(Copy(s, L-i+1, 1), n, code); st1:= IIf((n=0)And((i=1)Or(i=2)And(Z Or (n0<1))), ', Copy(c, n*2+1, 2)) + IIf((n>0), Copy(c,(i+11)*2-1, 2), IIf((i=2) Or Z, ', '整')) + st1; Z := (n=0); end; For i := 1 To Length(st) do If Copy(st, i, 4) = '亿万' Then Delete(st,i+2,2); NtoC := IIf( n0=0, '零', st + st1); End; |