Contributor: GAYLE DAVIS {$S-,R-,V-,I-,N-,B-,F-} { Converts REAL number to ENGLISH strings GAYLE DAVIS 1/21/94 Amounts up to and including $19,999,999.99 are supported. If you write amounts larger than that, you don't need a computer !! ====================================================================== Dedicated to the PUBLIC DOMAIN, this software code has been tested and used under BP 7.0/DOS and MS-DOS 6.2. } {$IFNDEF Ver40} {Allow overlays} {$F+,O-,X+,A-} {$ENDIF} USES CRT; CONST Dot : CHAR = #42; VAR SS : STRING; AA : REAL; FUNCTION EnglishNumber (Amt : REAL) : STRING; TYPE Mword = STRING [10]; Amstw = STRING [80]; {for function TenUnitToWord output} CONST NumStr : ARRAY [0..27] OF Mword = ('', 'ONE ', 'TWO ', 'THREE ', 'FOUR ', 'FIVE ', 'SIX ', 'SEVEN ', 'EIGHT ','NINE ', 'TEN ', 'ELEVEN ', 'TWELVE ', 'THIRTEEN ', 'FOURTEEN ', 'FIFTEEN ', 'SIXTEEN ', 'SEVENTEEN ', 'EIGHTEEN ', 'NINETEEN ', 'TWENTY ', 'THIRTY ', 'FORTY ', 'FIFTY ', 'SIXTY ', 'SEVENTY ', 'EIGHTY ', 'NINETY '); VAR S : STRING; Temp : REAL; DigitA, DigitB : INTEGER; Ams : STRING; Ac : STRING [2]; FUNCTION TenUnitToWord (TeUn : INTEGER) : Amstw; { convert tens and units to words } BEGIN IF TeUn < 21 THEN TenUnitToWord := NumStr [TeUn] ELSE TenUnitToWord := NumStr [TeUn DIV 10 + 18] + NumStr [TeUn MOD 10]; END; {function TenUnitToWord} BEGIN { Nothing bigger than 20 million } IF (Amt > 20000000.0) OR (Amt <= 0.0) THEN BEGIN EnglishNumber := ''; {null string if out of range} EXIT; END; { Convert 1,000,000 decade } Ams := ''; DigitA := TRUNC (Amt / 1E6); IF DigitA > 0 THEN Ams := Ams + NumStr [DigitA] + 'MILLION '; Temp := Amt - DigitA * 1E6; { Convert 100,000, 10,000, 1,000 decades } DigitA := TRUNC (Temp / 1E5); {extract 100,000 decade} IF DigitA > 0 THEN Ams := Ams + NumStr [DigitA] + 'HUNDRED '; Temp := Temp - DigitA * 1E5; DigitB := TRUNC (Temp / 1000); {extract sum of 10,000 and 1,000 decades} Ams := Ams + TenUnitToWord (DigitB); IF ( (DigitA > 0) OR (DigitB > 0) ) THEN Ams := Ams + 'THOUSAND '; {Convert 100, 10, unit decades} Temp := Temp - DigitB * 1000.0; DigitA := TRUNC (Temp / 100); {extract 100 decade} IF DigitA > 0 THEN Ams := Ams + NumStr [DigitA] + 'HUNDRED '; DigitB := TRUNC (Temp - DigitA * 100.0); {extract sum of 10 and unit decades} Ams := Ams + TenUnitToWord (DigitB); {Convert cents to form XX/100} IF INT (Amt) > 0.0 THEN Ams := Ams + 'AND '; DigitA := ROUND ( (FRAC (Amt) * 100) ); IF DigitA > 0 THEN BEGIN STR (DigitA : 2, Ac); IF Ac [1] = ' ' THEN Ac [1] := '0'; Ams := Ams + Ac + '/100' END ELSE Ams := Ams + 'NO/100'; EnglishNumber := Ams + ' Dollars'; END; BEGIN ClrScr; WriteLn(EnglishNumber (1234.55)); WriteLn(EnglishNumber (991234.55)); WriteLn(EnglishNumber (19891234.55)); Readkey; END.