'===========================================================================
' Subject: NUMERICAL VALUE TO WORDS           Date: 12-22-97 (16:40)       
'  Author: Don Schullian                      Code: PB                     
'  Origin: d83@ath.forthnet.gr              Packet: MISC.ABC
'===========================================================================
' ========================================================================
' ===  fValue2Words$( Number# )
' ===
' ===    by DASoft Vertical Solutions
' ===         Don Schullian
' ===         d83@ath.forthnet.gr
' ===
' ===  This function recreates an amount in words much like what is/was
' ===  used when printing checks.
' ===
' ===  This routine should run in Qbasic also but the data statements
' ===  will be removed from their local status and placed in the general
' ===  code area.
' ===
' ===  This code is released into Public Domain
' ========================================================================

TestCode:
  CLS
  N# = 1234567890123.45
  PRINT USING "#,###,###,###,###.##"; N#
  PRINT
  PRINT fValue2Words$( N# )

' ------------------------------------------------------------------------

FUNCTION fValue2Words$( Number# )

  DIM Cent     AS STRING                     ' word for decimal value
  DIM Dollar   AS STRING                     ' word for whole numbers
  DIM N        AS STRING                     ' string value of number
  DIM One (19) AS STRING                     ' words for 1 -> 19
  DIM P        AS INTEGER                    ' loop counter for N$
  DIM Th       AS INTEGER                    ' Thou$ element in use
  DIM Ten (09) AS STRING                     ' words for 10 -> 90 step 10
  DIM Thou(04) AS STRING                     ' words for Billion, etc.
  DIM V        AS INTEGER                    ' working value for 3 digits
  DIM W        AS STRING                     ' working string being built
  DIM X        AS INTEGER                    ' gen. purpose variable
                                             '
  RESTORE fV2Wdata                           ' read in the words to
    FOR X% = 1 TO 19 : READ One$(X%)  : NEXT ' be used
    FOR X% = 1 TO  9 : READ Ten$(X%)  : NEXT '
    FOR X% = 0 TO  4 : READ Thou$(X%) : NEXT '
    READ Dollar$, Cent$                      '
                                             '
  N$ = STR$( ( Number# + .005 ) * 100 )      ' convert nbr*100 to string
  X% = INSTR( N$, "." )                      ' find the decimal
  IF X% > 0 THEN N$ = LEFT$( N$, X%-1 )      ' got one! strip off excess
  N$  = SPACE$(15) + N$                      ' pad left with spaces
  N$  = RIGHT$( N$, 17 )                     ' get left most characters
  Th% = 4                                    ' Thou$ value to be used
                                             '
  FOR P% = 1 TO 13 STEP 3                    ' 3 chars at a time
    V% = VAL(MID$( N$, P%, 3 ))              '  value of 3 chars
    IF V% > 0 THEN                           '  we have s/th to do!
      IF V% > 99 THEN                        '   test for hundreds
        X% = ( V%  \  100 )                  '    # of hundreds
        V% = ( V% MOD 100 )                  '    remainder
        W$ = W$ + One$(X%) + Thou$(0)        '    add hundreds words
      END IF                                 '
      IF ( V% > 10 ) AND ( V% < 20 ) THEN    '   test for teens
          W$ = W$ + One$(V%) + Thou$(0)      '    add teens words
        ELSEif V% > 0 THEN                   '   anything left?
          IF V% > 9 THEN                     '    test for tens
            X% = ( V%  \  10 )               '     # of tens
            V% = ( V% MOD 10 )               '     remainder
            W$ = W$ + Ten$(X%)               '     add tens words
          END IF                             '
          IF V% > 0 THEN W$ = W$ + One$(V%)  '    any ones left over
      END IF                                 '
      IF Th% > 0 THEN W$ = W$ + Thou$(Th%)   '   thousands/mills/etc
    END IF                                   '
    Th% = Th% - 1                            '  reduce thous position
  NEXT                                       '
                                             '
  IF LEN(W$) = 0 THEN W$ = "00 "             ' no whole numbers found
  W$ = W$ + Dollar$ + RIGHT$(N$,2) + Cent$   ' add decimals
                                             '
  fValue2Words$ = W$                         ' RETURN STRING
  ' ---------------------------------------------------------------------
  ' ------------  LOCAL DATA STATEMENTS
  ' ---------------------------------------------------------------------
  fV2Wdata:
    DATA "ONE ","TWO ","THREE ","FOUR ","FIVE ","SIX ","SEVEN "
    DATA "EIGHT ", "NINE ","","ELEVEN ","TWELVE ","THIRTEEN "
    DATA "FOURTEEN ","FIFTEEN ","SIXTEEN ","SEVENTEEN "
    DATA "EIGHTEEN ","NINETEEN "

    DATA "TEN ","TWENTY ","THIRTY ","FORTY ","FIFTY ","SIXTY "
    DATA "SEVENTY ", "EIGHTY ","NINETY "

    DATA "HUNDRED ", "THOUSAND ","MILLION ","BILLION ","TRILLION "

    DATA "DOLLARS AND ", " CENTS"

END FUNCTION
