program NumberToWords;
{$mode objfpc}{$H+}
uses
SysUtils;
const
below20: array[0..19] of string = (
'', 'one', 'two', 'three', 'four', 'five', 'six', 'seven',
'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen',
'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen',
'nineteen'
);
tens: array[0..9] of string = (
'', '', 'twenty', 'thirty', 'forty', 'fifty',
'sixty', 'seventy', 'eighty', 'ninety'
);
function SetBelow20AndTens(num: Integer): string;
begin
if num = 0 then
Exit('');
if num < 20 then
Exit(below20[num] + ' ')
else if num < 100 then
Exit(tens[num div 10] + ' ' + SetBelow20AndTens(num mod 10))
else
Exit(below20[num div 100] + ' hundred ' + SetBelow20AndTens(num mod 100));
end;
function NumberToWords(num: Integer): string;
var
resultStr: string;
begin
if num = 0 then
Exit('zero');
resultStr := '';
if num >= 1000000000 then
begin
resultStr += SetBelow20AndTens(num div 1000000000) + 'billion ';
num := num mod 1000000000;
end;
if num >= 1000000 then
begin
resultStr += SetBelow20AndTens(num div 1000000) + 'million ';
num := num mod 1000000;
end;
if num >= 1000 then
begin
resultStr += SetBelow20AndTens(num div 1000) + 'thousand ';
num := num mod 1000;
end;
if num > 0 then
resultStr += SetBelow20AndTens(num);
// Trim trailing space
resultStr := Trim(resultStr);
Result := resultStr;
end;
var
n: Integer;
begin
n := 176283;
WriteLn(NumberToWords(n));
end.
(*
run:
one hundred seventy six thousand two hundred eighty three
*)