Mega Code Archive

 
Categories / Delphi / Examples
 

Simple Number to words rutine

Title: Simple Number to words rutine Question: As simple as I could get it to work, any suggestions are welcome. Answer: {**************************************************} { } { Number to letters unit version 1.1 } { } { copyright (C) Dylan Thomas 2000 } { } { License: No significant restrictions. } { } { Language: US. English } { } {**************************************************} 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 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.