引用高手的代码: function TFrmbill.NumTOChinaCode(i:Real):string; const d='零壹贰叁肆伍陆柒捌玖分角圆拾佰仟万拾佰仟亿'; var m,k:string; j:integer; begin k:=''; m:=floattostr(int(i*100)); 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]; result:=k; end;
财务软件中总少不了大写的金额表示方式,如下为一个简单的小写金额转换为大写的函数,其思路简单(可以说烂吧,居然利用了位置来转换),但是它却几乎可以无限制的转换,只要你能读得出来和写得进去: 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) downto 1 do begin {如果读到的不是小数点就继续} if qian<>dianweizhi then begin{位置上的数转换成大写} case strtoint(copy(Smallmonth,qian,1)) of1: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);”他自动默认小数点后两位
function TForm1.xTOd(i:Real):string; const d='零壹贰叁肆伍陆柒捌玖分角元拾佰仟万拾佰仟亿'; var m,k:string; j:integer; begin k:=''; m:=floattostr(int(i*100)); 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; 调用: procedure TForm1.Button1Click(Sender: TObject); var Sum:real; begin sum:=12.34; showmessage('人民币大写:'+xTOd(Sum)); end;
SmallHand(小手) 行不是行了,可是我发现最后老是少了一分,看看怎么回事
我两年前自己写的一个function,送给你吧!var Cdigs:array[0..9] of string=('零','壹','贰','叁','肆','伍', '陆','柒','捌','玖'); Cdsets:array[1..18] of string=('万','仟','佰','拾','亿', '仟','佰','拾','万','仟','佰','拾','圆','','角','分','厘','毫');Function GetCmoney(const Outv :real):string; var DStr,outStr,tmpstr: string; dsize,i:integer; CanZ: boolean; begin CanZ := False; Dstr := formatfloat('0.0000',Outv); dsize := length(Dstr); outStr :=''; for i:=dsize Downto 1 do begin if Dstr[i]='0' then begin if Canz then begin CanZ := False; tmpstr := '零' end else tmpstr := ''; if (CdSets[18-(Dsize-i)]='圆') or (CdSets[18-(Dsize-i)]='万') or (CdSets[18-(Dsize-i)]='亿') then tmpstr := CdSets[18-(Dsize-i)]+tmpstr; end else if Dstr[i]='.' then begin // if Copy(dstr,dsize-3,4)='0000' then // tmpstr := '整' tmpstr := ''; end else if Dstr[i]='-' then TmpStr := '负' else begin tmpStr := Cdigs[StrToInt(Dstr[i])] + CdSets[18-(Dsize-i)]; if Not CanZ then CanZ := true; end; OutStr := TmpStr+OutStr; end; if Copy(dstr,dsize-2,3)='000' then OutStr :=OutStr+ '整'; Result := OutStr; end;
function TFrmbill.NumTOChinaCode(i:Real):string;
const
d='零壹贰叁肆伍陆柒捌玖分角圆拾佰仟万拾佰仟亿';
var
m,k:string;
j:integer;
begin
k:='';
m:=floattostr(int(i*100));
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];
result:=k;
end;
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) downto 1 do
begin
{如果读到的不是小数点就继续}
if qian<>dianweizhi then
begin{位置上的数转换成大写}
case strtoint(copy(Smallmonth,qian,1)) of1: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);”他自动默认小数点后两位
const
d='零壹贰叁肆伍陆柒捌玖分角元拾佰仟万拾佰仟亿';
var
m,k:string;
j:integer;
begin
k:='';
m:=floattostr(int(i*100));
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; 调用:
procedure TForm1.Button1Click(Sender: TObject);
var
Sum:real;
begin
sum:=12.34;
showmessage('人民币大写:'+xTOd(Sum));
end;
Cdigs:array[0..9] of string=('零','壹','贰','叁','肆','伍',
'陆','柒','捌','玖');
Cdsets:array[1..18] of string=('万','仟','佰','拾','亿',
'仟','佰','拾','万','仟','佰','拾','圆','','角','分','厘','毫');Function GetCmoney(const Outv :real):string;
var DStr,outStr,tmpstr: string;
dsize,i:integer;
CanZ: boolean;
begin
CanZ := False;
Dstr := formatfloat('0.0000',Outv);
dsize := length(Dstr);
outStr :='';
for i:=dsize Downto 1 do
begin
if Dstr[i]='0' then
begin
if Canz then
begin
CanZ := False;
tmpstr := '零'
end
else tmpstr := ''; if (CdSets[18-(Dsize-i)]='圆') or
(CdSets[18-(Dsize-i)]='万') or
(CdSets[18-(Dsize-i)]='亿')
then tmpstr := CdSets[18-(Dsize-i)]+tmpstr;
end
else
if Dstr[i]='.' then
begin
// if Copy(dstr,dsize-3,4)='0000' then
// tmpstr := '整'
tmpstr := '';
end
else if Dstr[i]='-' then
TmpStr := '负'
else
begin
tmpStr := Cdigs[StrToInt(Dstr[i])] + CdSets[18-(Dsize-i)];
if Not CanZ then
CanZ := true;
end;
OutStr := TmpStr+OutStr;
end;
if Copy(dstr,dsize-2,3)='000' then
OutStr :=OutStr+ '整';
Result := OutStr;
end;
如10023,如果照" SmallHand(小手) "的算法会读成 "壹万零仟零佰贰拾叁圆零角零分",
而现实中应读"壹万零拾叁圆整"的。