function TDianFrm.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; 调用: Edit26.text:=xTOd(123123);
http://aiirii.mblogger.cn/posts/4690.aspx
function Tform1.SmallTOBig(small:real):string; var SmallMonth,BigMonth: string; wei1,qianwei1: string[2]; qianwei,dianweizhi,qian: integer; begin { 修改参数令值更精确 } qianwei:=-2; //小数点后的位置,需要的话也可以改动-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)) 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; inc(qianwei); BigMonth :=wei1+qianwei1+BigMonth;{组合成大写金额} end; end; SmallTOBig:=BigMonth; end;
{返回中文大写数字} function GetChinaNum(Num:TNumChar;ChinaNumFormat:TChinaNumFormat=cnfBig):string; begin case ChinaNumFormat of cnfArab:begin case Num of '0':Result:='0'; '1':Result:='1'; '2':Result:='2'; '3':Result:='3'; '4':Result:='4'; '5':Result:='5'; '6':Result:='6'; '7':Result:='7'; '8':Result:='8'; '9':Result:='9'; end; end; cnfBig:begin case Num of '0':Result:='零'; '1':Result:='壹'; '2':Result:='贰'; '3':Result:='叁'; '4':Result:='肆'; '5':Result:='伍'; '6':Result:='陆'; '7':Result:='柒'; '8':Result:='捌'; '9':Result:='玖'; end; end; cnfSmall:begin case Num of '0':Result:='零'; '1':Result:='一'; '2':Result:='二'; '3':Result:='三'; '4':Result:='四'; '5':Result:='五'; '6':Result:='六'; '7':Result:='七'; '8':Result:='八'; '9':Result:='九'; end; end; end; end;{将数字变成中文大写} function FloatToChinaBig(Num:Double;ChinaBigFormat:TChinaBigFormat=cbfFull;Blanks:Byte=0):string; var Str:string; AgainstStr:string; NumStr:string; i,j:Integer; AllNumLength:Integer; TempStr:string; begin if Blanks>15 then Blanks:=17; NumStr:=CurrToStrF(Num,ffFixed,2); Delete(NumStr,Pos('.',NumStr),1); AllNumLength:=Length(NumStr); if Blanks<=AllNumLength then Blanks:=AllNumLength else begin TempStr:=''; for i:=1 to Blanks-AllNumLength do begin TempStr:=TempStr+'0'; end; NumStr:=TempStr+NumStr; end; NumStr:=ReverseStr(NumStr); Str:=FormatFloat('0佰0拾0万0仟0佰0拾0亿0仟0佰0拾0万0仟0佰0拾0圆.0角0分',Num); Delete(Str,Pos('.',Str),1); AgainstStr:=ReverseStr(Str); AgainstStr:=Copy(AgainstStr,1,3*Blanks); if ChinaBigFormat=cbfBlank then begin AgainstStr:=''; for i:=1 to Blanks do AgainstStr:=AgainstStr+' '+NumStr[i]; end; j:=0; for i:=1 to Blanks do begin Insert(ReverseStr(GetChinaNum(AgainstStr[3*i+2*j])),AgainstStr,3*i+2*j); Inc(j); end; j:=0; for i:=1 to Blanks do begin Delete(AgainstStr,5*i-j,1); Inc(j); end; Result:=ReverseStr(AgainstStr); end;function FloatToChnStr(Value: Real; ClearZero: Boolean; full:Boolean=False): String; const ChnUnit: array[0..13] of string = ('分', '角', '元', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟'); ChnNum : array[0..9] of string = ('零', '壹','贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'); var I: Integer; StrValue, StrNum: String; ValueLen: Integer; begin if Value <= 0 then begin Result := '输入参数应大于零。'; Exit; end; value:=RoundTo(Value,-2); StrValue := IntToStr(Round(Value * 100)); ValueLen := Length(StrValue); Result := ''; for I := 1 to ValueLen do begin StrNum := StrValue[I]; Result := Result + ChnNum[StrToInt(StrNum)] + ChnUnit[ValueLen - I]; end; if ClearZero then begin Result := StringReplace(Result, '零分', '', [rfReplaceAll]); if Frac(Value)>0.009999 then Result := StringReplace(Result, '零角', '零', [rfReplaceAll]) else Result := StringReplace(Result, '零角', '', [rfReplaceAll]); Result := StringReplace(Result, '零元', '元', [rfReplaceAll]); Result := StringReplace(Result, '零拾', '零', [rfReplaceAll]); Result := StringReplace(Result, '零佰', '零', [rfReplaceAll]); Result := StringReplace(Result, '零仟', '零', [rfReplaceAll]); Result := StringReplace(Result, '零万', '万', [rfReplaceAll]); Result := StringReplace(Result, '零零', '零', [rfReplaceAll]); Result := StringReplace(Result, '零零', '零', [rfReplaceAll]); end; if full then begin if Frac(Value)<0.009999 then Result:=Result+'整'; end; end;
Function MaxtoMin(minje:string):string; var dx,dy,nn,cccc,dd,c,cc,lc:string; n,iii:integer; begin dx:='壹贰叁肆伍陆柒捌玖'; dy:='分角圆拾佰仟万拾佰仟亿拾佰'; nn:=trim(floattostr(strtofloat(minje)*100)); n:=length(nn); cccc:='整'; for iii:=1 to n do begin dd:=copy(dy,iii*2-1,2); c:=copy(nn,n-iii+1,1); if c<>'0' then begin cc:=copy(dx,(strtoint(c)*2 - 1),2); cccc:=trim(cc)+trim(dd)+trim(cccc); end else begin lc:=copy(trim(cccc),1,2); if ((iii=3) or (iii=7) or (iii=11)) then begin cccc:=trim(dd) + trim(cccc); continue; end; if ((lc<>'零') and (LC<>'整') and (LC<>'亿') and (LC<>'万') and (LC<>'圆')) then cccc:='零'+cccc; end; end; cccc:='合计:'+cccc; Result:=cccc;end; //调用: showmessage(MaxtoMin(trim('100'))); 都不知道是谁写的啦!
这东西漫天飞 function CurrencyToChinese(ACurrency: Currency): String; { 返回指定字符串的右边 N 个字符 } function _RightStr(S: String; N: Integer): String; var Start: Integer; begin Start := Length(S) - N + 1 ; if Start <= Length(S) then Result := Copy(S, Start, N) else Result := ''; end;var LowStr : String; // 小写金额字符串 CurrentChar : Char; // 当前数值的ASCII码 CurrentNum : Integer; // 当前数值 UpperStr, UnitageChar : String[4]; // 大写金额字符串和金额单位字符串 CurrentPos, UnitagePos : Integer; // 索引 const UNITAGE_STR : String = '仟佰拾亿仟佰拾万仟佰拾元角分'; // 单位大写中文字符串 UPPER_STR : String = '零壹贰叁肆伍陆柒捌玖'; // 数值大写中文字符串 begin { 让俺先看看金额是不是为零,如果是就省事啦 } if ACurrency=0 then begin Result := ''; // 这里您要是想返回'零'、或者一个圈或者一个减号都可以 Exit; end; { 不是零,要费点事儿啦 } Result := ''; FmtStr(LowStr, '%15.2f', [ACurrency]); // 将数值转换成字符串 LowStr := Trim(LowStr); // 去掉空格符 { 如果是负值,先把字符串里的那个负号去掉 } if ACurrency<0 then LowStr := Copy(LowStr, 2, Length(LowStr)-1); CurrentPos := 1; UnitagePos := 15 - Length(LowStr); while UnitagePos<14 do begin CurrentChar := LowStr[CurrentPos]; // 取当前位数字 if (CurrentChar>'9') or (CurrentChar<'0') then begin { 取到的字符可能不是数字(比如说是小数点) } Inc(CurrentPos); Continue; end; CurrentNum := Ord(CurrentChar) - Ord('0'); // 取当前数字的值 UpperStr := Copy(UPPER_STR, (CurrentNum shl 1)+1, 2); // 取相应的大写中文 UnitageChar := Copy(UNITAGE_STR, (UnitagePos shl 1)+1, 2); // 相应的单位 { 如果取得的数字不是零,很简单,在字符串后面添加上数值和单位就行了 } if (CurrentNum<>0) then begin Result := Result + UpperStr + UnitageChar; Inc(UnitagePos); Inc(CurrentPos); Continue; end; { 是零就麻烦了,先看看是不是重复零,不是就先加一个'零'再说 } if _RightStr(Result, 2) <> '零' then Result := Result + '零'; { 如果是零且又正好在'亿'、'万'、'元'这三个位置上,就…… 大家都清楚,没有'参拾零元'或'贰拾零万玖仟'这种说法,只有 '参拾元'和'贰拾万玖仟',因此要删去上面那句代码所加的'零'字符 } if (UnitageChar='亿') or (UnitageChar='万') or (UnitageChar='元') then begin Delete(Result, Length(Result)-1, 2); { 还要看看前一位是不是'亿'位,是就不加单位了 } if _RightStr(Result, 2)<>'亿' then Result := Result + UnitageChar; Result := Result + '零'; end; Inc(UnitagePos); Inc(CurrentPos); end; { 呀,终于转换完了,别忙,如果结果的末尾是'零'还要删去它 } if _RightStr(Result, 2)='零' then Result := Copy(Result, 1, Length(Result)-2); { 如果结果的开始就是零,也要删除它 } if Copy(Result, 1, 2)='零' then Result := Copy(Result, 3, Length(Result)-2); if _RightStr(Result, 2)='角' then { 如果结果正好是'XXXX角',按习惯应该加上一个'XXXX角正' } Result := Result + '正' else if _RightStr(Result, 2)<>'分' then { 如果结果不是'XXXX分,就要加上一个'整'字} Result := Result + '整'; if Copy(Result, 1, 2)='元' then { 还有一个小问题,就是…… } Result := _RightStr(Result, Length(Result)-4); { 最后,如果是负值还要加上一个'负' } if ACurrency<0 then Result := '负' + Result; end;
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;
调用:
Edit26.text:=xTOd(123123);
var
SmallMonth,BigMonth: string;
wei1,qianwei1: string[2];
qianwei,dianweizhi,qian: integer;
begin
{ 修改参数令值更精确 }
qianwei:=-2; //小数点后的位置,需要的话也可以改动-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)) 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;
inc(qianwei);
BigMonth :=wei1+qianwei1+BigMonth;{组合成大写金额}
end;
end;
SmallTOBig:=BigMonth;
end;
function GetChinaNum(Num:TNumChar;ChinaNumFormat:TChinaNumFormat=cnfBig):string;
begin
case ChinaNumFormat of
cnfArab:begin
case Num of
'0':Result:='0';
'1':Result:='1';
'2':Result:='2';
'3':Result:='3';
'4':Result:='4';
'5':Result:='5';
'6':Result:='6';
'7':Result:='7';
'8':Result:='8';
'9':Result:='9';
end;
end;
cnfBig:begin
case Num of
'0':Result:='零';
'1':Result:='壹';
'2':Result:='贰';
'3':Result:='叁';
'4':Result:='肆';
'5':Result:='伍';
'6':Result:='陆';
'7':Result:='柒';
'8':Result:='捌';
'9':Result:='玖';
end;
end;
cnfSmall:begin
case Num of
'0':Result:='零';
'1':Result:='一';
'2':Result:='二';
'3':Result:='三';
'4':Result:='四';
'5':Result:='五';
'6':Result:='六';
'7':Result:='七';
'8':Result:='八';
'9':Result:='九';
end;
end;
end;
end;{将数字变成中文大写}
function FloatToChinaBig(Num:Double;ChinaBigFormat:TChinaBigFormat=cbfFull;Blanks:Byte=0):string;
var
Str:string;
AgainstStr:string;
NumStr:string;
i,j:Integer;
AllNumLength:Integer;
TempStr:string;
begin
if Blanks>15 then Blanks:=17;
NumStr:=CurrToStrF(Num,ffFixed,2);
Delete(NumStr,Pos('.',NumStr),1);
AllNumLength:=Length(NumStr);
if Blanks<=AllNumLength then Blanks:=AllNumLength
else begin
TempStr:='';
for i:=1 to Blanks-AllNumLength do
begin
TempStr:=TempStr+'0';
end;
NumStr:=TempStr+NumStr;
end;
NumStr:=ReverseStr(NumStr);
Str:=FormatFloat('0佰0拾0万0仟0佰0拾0亿0仟0佰0拾0万0仟0佰0拾0圆.0角0分',Num);
Delete(Str,Pos('.',Str),1);
AgainstStr:=ReverseStr(Str);
AgainstStr:=Copy(AgainstStr,1,3*Blanks);
if ChinaBigFormat=cbfBlank then
begin
AgainstStr:='';
for i:=1 to Blanks do
AgainstStr:=AgainstStr+' '+NumStr[i];
end;
j:=0;
for i:=1 to Blanks do
begin
Insert(ReverseStr(GetChinaNum(AgainstStr[3*i+2*j])),AgainstStr,3*i+2*j);
Inc(j);
end;
j:=0;
for i:=1 to Blanks do
begin
Delete(AgainstStr,5*i-j,1);
Inc(j);
end;
Result:=ReverseStr(AgainstStr);
end;function FloatToChnStr(Value: Real; ClearZero: Boolean; full:Boolean=False): String;
const
ChnUnit: array[0..13] of string = ('分', '角', '元', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟');
ChnNum : array[0..9] of string = ('零', '壹','贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
var
I: Integer;
StrValue, StrNum: String;
ValueLen: Integer;
begin
if Value <= 0 then
begin
Result := '输入参数应大于零。';
Exit;
end;
value:=RoundTo(Value,-2);
StrValue := IntToStr(Round(Value * 100));
ValueLen := Length(StrValue);
Result := '';
for I := 1 to ValueLen do
begin
StrNum := StrValue[I];
Result := Result + ChnNum[StrToInt(StrNum)] + ChnUnit[ValueLen - I];
end;
if ClearZero then
begin
Result := StringReplace(Result, '零分', '', [rfReplaceAll]);
if Frac(Value)>0.009999 then
Result := StringReplace(Result, '零角', '零', [rfReplaceAll])
else
Result := StringReplace(Result, '零角', '', [rfReplaceAll]);
Result := StringReplace(Result, '零元', '元', [rfReplaceAll]);
Result := StringReplace(Result, '零拾', '零', [rfReplaceAll]);
Result := StringReplace(Result, '零佰', '零', [rfReplaceAll]);
Result := StringReplace(Result, '零仟', '零', [rfReplaceAll]);
Result := StringReplace(Result, '零万', '万', [rfReplaceAll]);
Result := StringReplace(Result, '零零', '零', [rfReplaceAll]);
Result := StringReplace(Result, '零零', '零', [rfReplaceAll]);
end;
if full then
begin
if Frac(Value)<0.009999 then
Result:=Result+'整';
end;
end;
=======================================
有这么多高手在,我就偷个懒了。//他们跟你一样懒,也是COPY的
var
dx,dy,nn,cccc,dd,c,cc,lc:string;
n,iii:integer;
begin
dx:='壹贰叁肆伍陆柒捌玖';
dy:='分角圆拾佰仟万拾佰仟亿拾佰';
nn:=trim(floattostr(strtofloat(minje)*100));
n:=length(nn);
cccc:='整';
for iii:=1 to n do
begin
dd:=copy(dy,iii*2-1,2);
c:=copy(nn,n-iii+1,1);
if c<>'0' then
begin
cc:=copy(dx,(strtoint(c)*2 - 1),2);
cccc:=trim(cc)+trim(dd)+trim(cccc);
end
else
begin
lc:=copy(trim(cccc),1,2);
if ((iii=3) or (iii=7) or (iii=11)) then
begin
cccc:=trim(dd) + trim(cccc);
continue;
end;
if ((lc<>'零') and (LC<>'整') and (LC<>'亿') and (LC<>'万') and (LC<>'圆')) then
cccc:='零'+cccc;
end;
end;
cccc:='合计:'+cccc;
Result:=cccc;end;
//调用:
showmessage(MaxtoMin(trim('100')));
都不知道是谁写的啦!
function CurrencyToChinese(ACurrency: Currency): String; { 返回指定字符串的右边 N 个字符 }
function _RightStr(S: String; N: Integer): String;
var
Start: Integer;
begin
Start := Length(S) - N + 1 ;
if Start <= Length(S) then
Result := Copy(S, Start, N)
else Result := '';
end;var
LowStr : String; // 小写金额字符串
CurrentChar : Char; // 当前数值的ASCII码
CurrentNum : Integer; // 当前数值
UpperStr, UnitageChar : String[4]; // 大写金额字符串和金额单位字符串 CurrentPos, UnitagePos : Integer; // 索引
const
UNITAGE_STR : String = '仟佰拾亿仟佰拾万仟佰拾元角分'; // 单位大写中文字符串
UPPER_STR : String = '零壹贰叁肆伍陆柒捌玖'; // 数值大写中文字符串
begin { 让俺先看看金额是不是为零,如果是就省事啦 }
if ACurrency=0 then
begin
Result := ''; // 这里您要是想返回'零'、或者一个圈或者一个减号都可以 Exit;
end; { 不是零,要费点事儿啦 }
Result := '';
FmtStr(LowStr, '%15.2f', [ACurrency]); // 将数值转换成字符串
LowStr := Trim(LowStr); // 去掉空格符 { 如果是负值,先把字符串里的那个负号去掉 }
if ACurrency<0 then LowStr := Copy(LowStr, 2, Length(LowStr)-1); CurrentPos := 1;
UnitagePos := 15 - Length(LowStr);
while UnitagePos<14 do
begin
CurrentChar := LowStr[CurrentPos]; // 取当前位数字
if (CurrentChar>'9') or (CurrentChar<'0') then
begin
{ 取到的字符可能不是数字(比如说是小数点) }
Inc(CurrentPos);
Continue;
end;
CurrentNum := Ord(CurrentChar) - Ord('0'); // 取当前数字的值
UpperStr := Copy(UPPER_STR, (CurrentNum shl 1)+1, 2); // 取相应的大写中文
UnitageChar := Copy(UNITAGE_STR, (UnitagePos shl 1)+1, 2); // 相应的单位 { 如果取得的数字不是零,很简单,在字符串后面添加上数值和单位就行了
}
if (CurrentNum<>0) then
begin
Result := Result + UpperStr + UnitageChar;
Inc(UnitagePos);
Inc(CurrentPos);
Continue;
end; { 是零就麻烦了,先看看是不是重复零,不是就先加一个'零'再说 }
if _RightStr(Result, 2) <> '零' then Result := Result + '零'; { 如果是零且又正好在'亿'、'万'、'元'这三个位置上,就……
大家都清楚,没有'参拾零元'或'贰拾零万玖仟'这种说法,只有
'参拾元'和'贰拾万玖仟',因此要删去上面那句代码所加的'零'字符
}
if (UnitageChar='亿') or (UnitageChar='万') or (UnitageChar='元')
then
begin
Delete(Result, Length(Result)-1, 2);
{ 还要看看前一位是不是'亿'位,是就不加单位了 }
if _RightStr(Result, 2)<>'亿' then
Result := Result + UnitageChar;
Result := Result + '零';
end;
Inc(UnitagePos);
Inc(CurrentPos);
end; { 呀,终于转换完了,别忙,如果结果的末尾是'零'还要删去它 }
if _RightStr(Result, 2)='零' then
Result := Copy(Result, 1, Length(Result)-2); { 如果结果的开始就是零,也要删除它 }
if Copy(Result, 1, 2)='零' then
Result := Copy(Result, 3, Length(Result)-2); if _RightStr(Result, 2)='角' then
{ 如果结果正好是'XXXX角',按习惯应该加上一个'XXXX角正' }
Result := Result + '正'
else if _RightStr(Result, 2)<>'分' then
{ 如果结果不是'XXXX分,就要加上一个'整'字}
Result := Result + '整'; if Copy(Result, 1, 2)='元' then
{ 还有一个小问题,就是…… }
Result := _RightStr(Result, Length(Result)-4); { 最后,如果是负值还要加上一个'负' }
if ACurrency<0 then
Result := '负' + Result;
end;