Contributor: WAYNE MOSES              

{
From: WAYNE MOSES
Subj: Spell a Number
---------------------------------------------------------------------------
 *> Quoting Chris Serino to All on 01-04-94  17:28
 *> Re: Help Looking for a Number

 Hello Chris:

 CS> I'm in the process of writing a Checkbook program for my Job and I
 CS> was  wondering if anyone out there has a routine to convert a check
 CS> amount written  in numerical to text.  Here's an example of what I
 CS> need. Input Variable :  142.50
 CS> Needed Output  : One Hundred Foury Two 50/100--------------------

 Weeeelllll ... since I am not really interested in releasing my personal
 check writing program to the world, I'll upload what I wrote last month.

 ------- 8<------------[ CUT LINE ]-------------- >8 -------
}
Function Translate(var DollarAmt : real) : string;

(*
   This is a module that converts the numerical dollar amount to a string,
   for example it converts $156.15 to :

               'One Hundred and Fifty Six dollars ------------15/xx'.

   The field length of the translated amount is limited to 53 characters.

   Amounts up to and including $99,999.99 are supported.  I rarely write
   cheques larger than that, so they can be written by hand. ;-)

   ======================================================================
   Dedicated to the PUBLIC DOMAIN, this software code has been tested and
   used under TP 6.0/DOS and MS-DOS 6.2.
   ======================================================================
*)

const
     SingleSpelled : array[1..9] of string = ('One ','Two ','Three ','Four ',
                                              'Five ','Six ','Seven ','Eight ',
                                              'Nine ');

     TeenSpelled : array[1..9] of string = ('Eleven ','Twelve ','Thirteen ',
                                            'Fourteen ','Fifteen ','Sixteen ',
                                            'Seventeen ','Eighteen ','Nineteen');

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

var
   Dollars, Cents,
   SingleStr, TenStr, HundredStr, ThousandStr   : string;
   Singles, Tens, Hundreds, Thousands, k, l     : integer;

begin
     if DollarAmt = 0 then         (* The amount to be translated is 0.00 *)
     begin                         (* so the Dollars and Cents must be    *)
          Dollars := 'Zero ';      (* to reflect this.                    *)
          Cents   := '00';
     end

     else
     begin                         (* Non trivial value for DollarAmt     *)

     SingleStr := ''; TenStr := ''; HundredStr := ''; ThousandStr := '';

     { Parse the Cents out of DollarAmt }

     Str(frac(DollarAmt):0:2, Cents);
     if frac(DollarAmt) > 0 then
        Cents := copy(Cents,pos('.',Cents)+1,2)
     else
         Cents := '00';

     { Next parse the Dollars out of DollarAmt }

     Str(int(DollarAmt):1:0, Dollars);

     { Now, define the number of Singles, Tens, Hundreds, and Thousands }

     Thousands   := trunc(DollarAmt/1000);

     Hundreds    := trunc(DollarAmt/100)-Thousands*10;
     HundredStr  := SingleSpelled[Hundreds];

     Tens        := trunc(DollarAmt/10)-(Thousands*100+Hundreds*10);

     Singles     := trunc(DollarAmt)-(Thousands*1000+Hundreds*100+Tens*10);
     SingleStr   := SingleSpelled[Singles];

     case Tens of
     1    : begin
                 TenStr := TeenSpelled[Singles];
                 SingleStr := '';
            end;
     2..9 : TenStr := TenSpelled[Tens];
     end;

     case Thousands of
     10,20,
     30,50,
     60,70,
     80,90  : ThousandStr := TenSpelled[trunc(Thousands/10)];
     1..9   : ThousandStr := SingleSpelled[Thousands];
     11..19 : ThousandStr := TeenSpelled[Thousands-10];

     21..29 : ThousandStr := TenSpelled[trunc(Thousands/10)]+
                             SingleSpelled[Thousands-20];
     31..39 : ThousandStr := TenSpelled[trunc(Thousands/10)]+
                             SingleSpelled[Thousands-30];
     41..49 : ThousandStr := TenSpelled[trunc(Thousands/10)]+
                             SingleSpelled[Thousands-40];
     51..59 : ThousandStr := TenSpelled[trunc(Thousands/10)]+
                             SingleSpelled[Thousands-50];
     61..69 : ThousandStr := TenSpelled[trunc(Thousands/10)]+
                             SingleSpelled[Thousands-60];
     71..79 : ThousandStr := TenSpelled[trunc(Thousands/10)]+
                             SingleSpelled[Thousands-70];
     81..89 : ThousandStr := TenSpelled[trunc(Thousands/10)]+
                             SingleSpelled[Thousands-80];
     91..99 : ThousandStr := TenSpelled[trunc(Thousands/10)]+
                             SingleSpelled[Thousands-90];
     end;

     if Thousands > 0 then
        Dollars := ThousandStr+'Thousand '+HundredStr+'Hundred & '
                   + TenStr + SingleStr
     else
     if (Hundreds > 0) and (Thousands = 0) then
        Dollars := HundredStr+'Hundred and '+ TenStr + SingleStr
     else
         Dollars := TenStr + SingleStr;

     end;                              (* End of block for non-trivial    *)
                                       (* value for DollarAmt             *)
     l := length(Dollars);

     for k := 1 to 60-(10+l+length(Cents)) do
         Dollars := Dollars+'-';

     If Thousands <100 then Translate := Dollars+Cents+'/xx' else begin 
	TextColor(Yellow+Blink); 
	Translate := '******** INVALID!  THIS AMOUNT NOT SUPPORTED ********'; 
	end; 
end; 

misc0083.html