//金额小写转大写---------------------------------------------------------------- class function TStrOper.MoneyConvert(aMoney: real): string; const s1: string = '零壹贰叁肆伍陆柒捌玖'; s2: string = '分角元拾佰仟万拾佰仟亿拾佰仟万'; function StrTran(const S, s1, s2: string): string; begin Result := StringReplace(S, s1, s2, [rfReplaceAll]); end; var S, dx: string; i, Len: Integer; begin if aMoney < 0 then begin dx := '负'; aMoney := -aMoney; end; S := Format('%.0f', [aMoney * 100]); Len := Length(S); for i := 1 to Len do dx := dx + Copy(s1, (Ord(S[i]) - Ord('0')) * 2 + 1, 2) + Copy(s2, (Len - i)* 2 + 1, 2); dx := StrTran(StrTran(StrTran(StrTran(StrTran(dx, '零仟', '零'), '零佰','零'),'零拾', '零'), '零角', '零'), '零分', '整'); dx := StrTran(StrTran(StrTran(StrTran(StrTran(dx, '零零', '零'), '零零','零'),'零亿', '亿'), '零万', '万'), '零元', '元'); if dx = '整' then Result := '零元整' else Result := StrTran(StrTran(dx, '亿万', '亿零'), '零整', '整'); end;我一直在用的。效果还不错。
自己改这个函数,或者直接在转换完成的字符串上把最后地元整去掉。 如: if Pos('元整', SourceStr)> 0 then SourceStr := Copy(SourceStr,1,Length(SourceStr) - 5);
function changeToCap(d:double):string; const Cons1:array[0..10]of string=('分','角','元','拾','佰','仟','万','拾','佰','仟','亿'); Cons2:array[0..9]of string=('零','壹','贰','叁','肆','伍','陆','柒','捌','玖'); var i,dd:int64; jj:double; str:string; begin i:=0;dd:=0;str:=''; jj:=d*100; dd:=Trunc(jj); repeat str:=Cons2[dd mod 10]+Cons1[i]+str; Inc(i); if i=11 then i:=7; dd:=dd div 10; until dd*10=0; Result:=str; end; 这是我的算法
4940 div 1000 = 4 -> 肆仟4940 mod 1000 = 940 div 100 = 9 ->玖佰
function MoneyConvert(mmje:real): string;
const
s1: string = '零壹贰叁肆伍陆柒捌玖';
s2: string = '分角元拾佰仟万拾佰仟亿拾佰仟万';
function StrTran(const S, s1, s2: string): string;
begin
Result := StringReplace(S, s1, s2, [rfReplaceAll]);
end;
var
S, dx: string;
i, Len: Integer;
begin
if mmje < 0 then
begin
dx := '负';
mmje := -mmje;
end;
S := Format('%.0f', [mmje * 100]);
Len := Length(S);
for i := 1 to Len do
dx := dx + Copy(s1, (Ord(S[i]) - Ord('0')) * 2 + 1, 2) + Copy(s2, (Len - i)* 2 + 1, 2);
dx := StrTran(StrTran(StrTran(StrTran(StrTran(dx, '零仟', '零'), '零佰','零'),'零拾', '零'), '零角', '零'), '零分', '整');
dx := StrTran(StrTran(StrTran(StrTran(StrTran(dx, '零零', '零'), '零零','零'),'零亿', '亿'), '零万', '万'), '零元', '元');
if dx = '整' then
Result := '零元整'
else
Result := StrTran(StrTran(dx, '亿万', '亿零'), '零整', '整');
end;
class function TStrOper.MoneyConvert(aMoney: real): string;
const
s1: string = '零壹贰叁肆伍陆柒捌玖';
s2: string = '分角元拾佰仟万拾佰仟亿拾佰仟万';
function StrTran(const S, s1, s2: string): string;
begin
Result := StringReplace(S, s1, s2, [rfReplaceAll]);
end;
var
S, dx: string;
i, Len: Integer;
begin
if aMoney < 0 then
begin
dx := '负';
aMoney := -aMoney;
end;
S := Format('%.0f', [aMoney * 100]);
Len := Length(S);
for i := 1 to Len do
dx := dx + Copy(s1, (Ord(S[i]) - Ord('0')) * 2 + 1, 2) + Copy(s2, (Len - i)* 2 + 1, 2);
dx := StrTran(StrTran(StrTran(StrTran(StrTran(dx, '零仟', '零'), '零佰','零'),'零拾', '零'), '零角', '零'), '零分', '整');
dx := StrTran(StrTran(StrTran(StrTran(StrTran(dx, '零零', '零'), '零零','零'),'零亿', '亿'), '零万', '万'), '零元', '元');
if dx = '整' then
Result := '零元整'
else
Result := StrTran(StrTran(dx, '亿万', '亿零'), '零整', '整');
end;我一直在用的。效果还不错。
如:
if Pos('元整', SourceStr)> 0 then
SourceStr := Copy(SourceStr,1,Length(SourceStr) - 5);
const
Cons1:array[0..10]of string=('分','角','元','拾','佰','仟','万','拾','佰','仟','亿');
Cons2:array[0..9]of string=('零','壹','贰','叁','肆','伍','陆','柒','捌','玖');
var
i,dd:int64;
jj:double;
str:string;
begin
i:=0;dd:=0;str:='';
jj:=d*100;
dd:=Trunc(jj);
repeat
str:=Cons2[dd mod 10]+Cons1[i]+str;
Inc(i);
if i=11 then
i:=7;
dd:=dd div 10;
until dd*10=0;
Result:=str;
end;
这是我的算法