大写金额转为英文的算法 修改版

从网上找到了这个算法,原作是Dylan Thomas,但是我使用后发现有少少的缺点,例如英文金额的习惯是小数用Cents Twenty-Five这样的表示,但原版中没有小数的功能,只是简单的用百分数表示了。

另外十位的部分也有少许欠缺,25应为:Twenty-Five,再其次就是增加了0到1之间的小数的表示。我在网上搜了一下发现似乎没人修正这些问题,特此发贴与大家分享:

{**********}
{ }
{ Number to letters unit version 1.2 }
{ }
{ copyright (C) Dylan Thomas 2000 }
{ }
{ License: No significant restrictions. }
{ }
{ Language: US. English }
{ }
{ Last Edit By logitech1229 2006. }
{ }

{**********}

unit NumberToLetters;

interface

(* This function returns the written equivalent of a number. *)
function NumToLetters(Number: Real): string;

implementation
uses SysUtils;

type

TNumberStr = string[13];

const
Numbers: array[1..19] of TNumberStr = ('One','Two','Three', 'Four',
'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Eleven', 'Twelve',
'Thirteen', 'Fourteen', 'Fifteen', 'Sixteen', 'Seventeen', 'Eighteen',
'Nineteen');

Tenths: array[1..9] of TNumberStr = ('Ten', 'Twenty', 'Thirty', 'Forty',
'Fifty', 'Sixty', 'Seventy','Eighty','Ninety');

ErrorString = 'not in valid range';

Min = 1.00;
Max = 4294967295.99;

function NumToLetters(Number: Real): string;
var Dec:String;
function RecurseNumber(N: LongWord): string;
begin
case N of
1..19:
Result := Numbers[N];
20..99:
begin
if (N in [20,30,40,50,60,70,80,90]) then Result := Tenths[N div 10]
else Result := Tenths[N div 10] +'-'+ RecurseNumber(N mod 10);
end;
100..999:
Result := Numbers[N div 100] + ' Hundred And ' + RecurseNumber(N mod 100);
1000..999999:
Result := RecurseNumber(N div 1000) + ' Thousand, ' +
RecurseNumber(N mod 1000);
1000000..999999999: Result := RecurseNumber(N div 1000000) + ' Million, '
+ RecurseNumber(N mod 1000000);
1000000000..4294967295: Result := RecurseNumber(N div 1000000000) +
' Billion, ' + RecurseNumber(N mod 1000000000);
end; {Case N of}
end; {RecurseNumber}

begin
{Calls := 0;} 
if (Number >= Min) and (Number <= Max) then
begin
Result := RecurseNumber(Round(Int(Number)));
{Added for cents in a currency value}
if not(Frac(Number) = 0.00) then
  {write like 'cents Twenty-five',If you want a result like 'Nought Point two five',you can use strings in {}}
  Result :=Result + ' And Cents '+ RecurseNumber(Round(Frac(Number)*100))
  {Result :=Result +' Point '+ RecurseNumber(Round(Int(Frac(Number)*10)))+' '+RecurseNumber(Round(Int(Frac(Number*10)*10)))}
else Result := Result +' Only';

end;
if (Number >0) and (Number<Min) then
begin
  if not(Frac(Number) = 0.00) then
  {write like 'cents Twenty-five',If you want a result like 'Nought Point two five',you can use strings in {}}
  Result :=Result + ' Cents '+ RecurseNumber(Round(Frac(Number)*100));
  {Result :=Result +' Point '+ RecurseNumber(Round(Int(Frac(Number)*10)))+' '+RecurseNumber(Round(Int(Frac(Number*10)*10)))}
end;
end;{NumToLetters}

end.
字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z