转贴
unit NumberToLetters;
interface
{var
Calls: Integer;} //Use to count number of recursive calls
(* 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;
function RecurseNumber(N: LongWord): string;
begin
{Inc(Calls);} //Use to count the number of recursive calls
case N of
1..19:
Result := Numbers[N];
20..99:
Result := Tenths[N div 10] + ' ' + RecurseNumber(N mod 10);
100..999:
Result := Numbers[N div 100] + ' hundred ' + 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;} //Use to count the number of recursive calls
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
Result := Result + ' and ' + IntToStr(Round(Frac(Number) * 100)) +
'/100';
end
else
raise ERangeError.CreateFmt('%g ' + ErrorString + ' %g..%g',
[Number, Min, Max]);
end;
{NumToLetters}
end.