DELPHI将金额 转换成中文大写,与英文大写

转成中文大写

// 数字转大写金额

class function TFTFloatFunc.RMBFloatToChinese(ARMBCash: Real): string;

const

cNum: WideString = '零壹贰叁肆伍陆柒捌玖-万仟佰拾亿仟佰拾万仟佰拾元角分';

cCha: array [0 .. 1, 0 .. 11] of string =

(('零仟', '零佰', '零拾', '零零零', '零零', '零亿', '零万', '零元', '亿万', '零角', '零分', '零整'),

('零', '零', '零', '零', '零', '亿', '万', '元', '亿', '零', '整', '整'));

var

i: Integer;

sNum: WideString;

begin

Result := '';

sNum := FormatFloat('0', ARMBCash * 100);

for i := 1 to Length(sNum) do

Result := Result + cNum[Ord(sNum[i]) - 47] + cNum[26 - Length(sNum) + i];

for i := 0 to 11 do // 去掉多余的零

Result := StringReplace(Result, cCha[0, i], cCha[1, i], [rfReplaceAll]);

end;

转成 英文大写

class function TFTFloatFunc.RMBFloatToEnglish(ARMBCash: Real ; intRMB: Boolean): string;

function Left(const AStr: string; ACount: Integer): string;

begin

Result := Copy(astr,1,ACount);

end;

function Right(const AStr: string; ACount: Integer): string;

begin

Result := Copy(astr,Length(AStr)-acount+1, ACount);

end;

//将在1-19之间的数字转换成英文表示法

function DigitToEn1(strDigits: String): String;

begin

Case StrToInt(strDigits) of

1: Result := 'ONE';

2: Result := 'TWO';

3: Result := 'THREE';

4: Result := 'FOUR';

5: Result := 'FIVE';

6: Result := 'SIX';

7: Result := 'SEVEN';

8: Result := 'EIGHT';

9: Result := 'NINE';

10: Result := 'TEN';

11: Result := 'ELEVEN';

12: Result := 'TWELVE';

13: Result := 'THIRTEEN';

14: Result := 'FOURTEEN';

15: Result := 'FifTEEN';

16: Result := 'SIXTEEN';

17: Result := 'SEVENTEEN';

18: Result := 'EIGHTEEN';

19: Result := 'NINETEEN';

else

Result := '';

end;

end;

//将在1-99之间的数字转换成英文表示法

function DigitToEn2(strDigits: String): String;

var

strTemp: String;

begin

if StrToInt(strDigits) < 20 then

Result := DigitToEn1(strDigits)

else begin

Case StrToInt(Left(strDigits, 1)) of

2: strTemp := 'TWENTY';

3: strTemp := 'THIRTY';

4: strTemp := 'FORTY';

5: strTemp := 'FIFTY';

6: strTemp := 'SIXTY';

7: strTemp := 'SEVENTY';

8: strTemp := 'EIGHTY';

9: strTemp := 'NINETY';

else

strTemp := '';

end;

if Right(strDigits, 1) <> '0' then

strTemp := strTemp + '-' + DigitToEn1(Right(strDigits, 1));

Result := strTemp;

end;

end;

//将在1-999之间的数字转换成英文表示法

//如intFormat为1,则在HUNDRED 后面就有 AND,否则没有。

function DigitToEn3(strDigits: String; intFormat: Integer): String;

begin

//去掉数字串前面的0

strDigits := IntToStr(StrToInt(strDigits));

if StrToFloat(strDigits) <= 19 then

Result := DigitToEn1(strDigits)

else if (StrToFloat(strDigits) >= 20) and (StrToFloat(strDigits) <= 99) then

Result := DigitToEn2(strDigits)

else begin

Result := DigitToEn1(Left(strDigits, 1)) + ' HUNDRED AND';

if (StrToFloat(Right(strDigits, 2)) > 0) and

(StrToFloat(Right(strDigits, 2)) < 20) then

if intFormat = 1 then

Result := Result + ' '+DigitToEn1(Right(strDigits, 2)) //' AND ' +

else

Result := Result + ' ' + DigitToEn1(Right(strDigits, 2))

else if (StrToFloat(Right(strDigits, 2)) >= 20)

and (StrToFloat(Right(strDigits, 2)) <= 99) then

if intFormat = 1 then

Result := Result + ' ' + DigitToEn2(Right(strDigits, 2)) //AND

else

Result := Result + ' ' + DigitToEn2(Right(strDigits, 2));

end;

end;

var

// 整数部份 小数部份

strInteger, strDecimal: String;

strTemp: String;

strDigits :string;

begin

//只能到千亿,万亿其实是没有意义的

if (ARMBCash > 999999999999.99) or ( ARMBCash< 0.01) then

raise exception.Create('Out of range, must between 0.01 - 999999999999.99');

strDigits:= FloatToStr(ARMBCash);

//有整数部分及小数部分

if (Int(ARMBCash) > 0) and (ARMBCash - Int(ARMBCash) > 0) then

begin

strInteger := Left(strDigits, Pos('.', strDigits) - 1);

strDecimal := Right(strDigits, Length(strDigits) - Pos('.', strDigits));

end

//只有整数部分

else if Int(ARMBCash) > 0 then

strInteger := IntToStr(System.Round(ARMBCash))

//只有小数部分

else if ARMBCash - Int(ARMBCash) > 0 then

strDecimal := Right(strDigits, Length(strDigits) - Pos('.', strDigits));

//得到整数部分英文表示法

if strInteger <> '' then begin

strTemp := DigitToEn3(Right(strInteger, 3), 1);

if Length(strInteger) > 3 then begin

strTemp := DigitToEn3(Left(Right(strInteger, 6),

Length(Right(strInteger, 6)) - 3), 2) + ' THOUSAND AND ' + strTemp;

//百万以上

if Length(strInteger) > 6 then

strTemp := DigitToEn3(Left(strInteger, Length(strInteger) - 6), 2) +

' MILLION AND ' + strTemp;

//十亿以上

if Length(strInteger) > 9 then

strTemp := DigitToEn3(Left(strInteger, Length(strInteger) - 9), 2) +

' BILLION AND ' + strTemp;

end;

strInteger := strTemp;

end;

if (strDecimal <> '') and (Length(strDecimal) <= 3) then

strDecimal := DigitToEn3(strDecimal, 1);

if (strInteger <> '') and (strDecimal <> '') then

if intRMB then

Result := strInteger + ' YUANS AND ' + strDecimal + ' CENTS ONLY'

else

Result := strInteger + ' DOLLARS AND ' + strDecimal + ' CENTS ONLY'

else if strInteger <> '' then

if intRMB then

Result := strInteger + ' YUANS ONLY'

else

Result := strInteger + ' DOLLARS ONLY'

else if strDecimal <> '' then

Result := strDecimal + ' CENTS ONLY'

else

Result := 'ZERO';

end;