'===========================================================================
' Subject: CONVERT NUMBERS INTO WORDS         Date: 10-14-00 (07:43)       
'  Author: Don Schullian                      Code: PB                     
'  Origin: d83@DASoftVSS.com                Packet: PB.ABC
'===========================================================================
'    ----------------------------                         PowerBASIC v3.5
' ---|          DASoft          |------------------------------------------
'    ----------------------------    Public Domain       DATE: 2000-10-14
'    | FILE NAME   Val2Wrds.bas |       code by
'    | DIRECTORY                |  Don Schullian, Jr.
'    ----------------------------
'  PURPOSE: convert numbers into words for check printing, etc.
'   PARAMS: Number# incoming - any valid number
'  RETURNS: the number in text
'           eg: fValue2Words$ ( 100.10 ) returns
'              "ONE HUNDRED DOLLARS AND 10 CENTS"
'   NOTE: the function is not set-up to handle negative numbers as they
'          would not appear on a check
' -------------------------------------------------------------------------

CLS
PRINT fValue2Words(32421009.34)
PRINT
PRINT fValue2Words(900132924462342.00)
PRINT
PRINT fValue2Words(123.10)

DECLARE FUNCTION fValue2Words (BYVAL Number AS DOUBLE) AS STRING

FUNCTION fValue2Words ( BYVAL Number AS DOUBLE ) AS STRING

  DIM Cma     AS LOCAL  STRING
  DIM I       AS LOCAL  INTEGER
  DIM Last    AS LOCAL  INTEGER
  DIM Nbr     AS LOCAL  STRING
  DIM Plc     AS LOCAL  INTEGER
  DIM Temp    AS LOCAL  STRING
  DIM V       AS LOCAL  INTEGER
  DIM Wrd(35) AS STATIC STRING

  IF LEN(Wrd(1)) = 0 THEN
    RESTORE Value2WordsData
    FOR I = 0 TO 35
      READ Wrd(I)
    NEXT
  END IF

  Nbr  = USING$("###############,.##",Number)             ' a number to work with
  Cma  = MID$(pbvUsingChrs,3,1)                           ' thou sep char
  Last = TALLY( Nbr, Cma ) + 1                            ' # of pieces
  Plc  = 1                                                '
  '-------------------------------------------------------'
  DO                                                      ' from left to right
    DECR Last                                             '
    V   = VAL( EXTRACT$(MID$(Nbr,Plc), Cma) )             ' get the 000
    Plc = INSTR(Plc,Nbr,Cma) + 1                          '
    IF V = 0 THEN ITERATE                                 ' nada!
    IF V > 99 THEN                                        ' hundreds position
      I = ( V  \  100 )                                   '   # of hundreds
      V = ( V MOD 100 )                                   '   > 100
      Temp = Temp & Wrd(I) & Wrd(33)                      '   add words
    END IF                                                '
    IF ( V > 10 ) AND ( V < 20 ) THEN                     ' teens
        Temp = Temp & Wrd(V)                              '   add words
      ELSEIF V > 0 THEN                                   ' anything left?
        IF V > 9 THEN                                     ' tens
          I = ( V  \  10 )                                '   # of tens - 1
          V = ( V MOD 10 )                                '   strip tens
          Temp = Temp & Wrd(I+19)                         '   add words
        END IF                                            '
        IF V > 0 THEN Temp = Temp & Wrd(V)                ' ones
    END IF                                                '
    IF Last > 0 THEN Temp = Temp & Wrd(Last+28)           ' thousands/mills/etc
  LOOP UNTIL Last = 0                                     '
  '-------------------------------------------------------'
  IF LEN(Temp) = 0 THEN Temp = Wrd(0)                     ' no ones!
  Temp = Temp & Wrd(34) & RIGHT$(Nbr,2) & Wrd(35)         ' add decimals
  '-------------------------------------------------------'-----------------------
  FUNCTION = Temp                                         ' RETURN STRING
                                                          '-----------------------
  Value2WordsData:                                        '
  DATA "00 "                                              ' "NO " is alternate
  DATA "ONE ", "TWO ", "THREE ", "FOUR ", "FIVE ", "SIX " '
  DATA "SEVEN ", "EIGHT ", "NINE ", "", "ELEVEN "         '
  DATA "TWELVE ", "THIRTEEN ", "FOURTEEN ", "FIFTEEN "    '
  DATA "SIXTEEN ", "SEVENTEEN ", "EIGHTEEN ", "NINETEEN " '
  DATA "TEN ", "TWENTY ", "THIRTY ", "FORTY ", "FIFTY "   '
  DATA "SIXTY ", "SEVENTY ", "EIGHTY ", "NINETY "         '
  DATA "THOUSAND ", "MILLION ", "BILLION ", "TRILLION "   '
  DATA "HUNDRED ", "DOLLARS AND ", " CENTS"               '

END FUNCTION
