home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / progmisc / nfsrc21.zip / NTOW.PRG < prev    next >
Text File  |  1991-08-16  |  4KB  |  140 lines

  1. /*
  2.  * File......: NTOW.PRG
  3.  * Author....: Gary Baren
  4.  * CIS ID....: 75470,1027
  5.  * Date......: $Date:   15 Aug 1991 23:05:54  $
  6.  * Revision..: $Revision:   1.1  $
  7.  * Log file..: $Logfile:   E:/nanfor/src/ntow.prv  $
  8.  *
  9.  * This is an original work by Gary Baren and is hereby placed in the
  10.  * public domain.
  11.  *
  12.  * Modification history:
  13.  * ---------------------
  14.  *
  15.  * $Log:   E:/nanfor/src/ntow.prv  $
  16.  * 
  17.  *    Rev 1.1   15 Aug 1991 23:05:54   GLENN
  18.  * Forest Belt proofread/edited/cleaned up doc
  19.  * 
  20.  *    Rev 1.0   09 Jun 1991 00:26:56   GLENN
  21.  * Initial revision.
  22.  *  
  23.  */
  24.  
  25.  
  26.  
  27.  
  28. /*  $DOC$
  29.  *  $FUNCNAME$
  30.  *     FT_NTOW()
  31.  *  $CATEGORY$
  32.  *     Conversion
  33.  *  $ONELINER$
  34.  *     Translate numeric value to words
  35.  *  $SYNTAX$
  36.  *     FT_NTOW( <nNumber> ) -> cWords
  37.  *  $ARGUMENTS$
  38.  *     <nNumber>  An integer to translate 
  39.  *  $RETURNS$
  40.  *     A text string representing <nNumber>
  41.  *  $DESCRIPTION$
  42.  *      Translates numeric input to a text string.
  43.  *
  44.  *      FT_NTOW is intended to be used with integers only.  Since I don't   
  45.  *      know what your application will be, I can't assume the type of
  46.  *      fraction you want returned (ninety nine cents, 99/100, .99, etc).
  47.  *      If you want the fraction in words, just pass it as an integer.
  48.  *
  49.  *      Do not pass a negative number!  Handle negative numbers any way
  50.  *      you need to in your code.  (ie: CR, DB, Negative, Minus, etc.)
  51.  *
  52.  *      Also, numeric 0 is returned as a null string.  You will need to 
  53.  *      make a decision how to output it (zero dollars, no dollars, etc).
  54.  *  $EXAMPLES$
  55.  *        ? FT_NTOW( 999 )        -> Nine Hundred Ninety Nine
  56.  *
  57.  *        ? FT_NTOW( 1000 )        -> One Thousand
  58.  *
  59.  *        ? FT_NTOW( 23 ) + " Dollars and " + FT_NTOW( 99 ) + " Cents"
  60.  *            -> Twenty Three Dollars and Ninety Nine Cents
  61.  *
  62.  *        ? FT_NTOW( 23 ) + " Dollars and " + "99/100"
  63.  *            -> Twenty Three Dollars and 99/100
  64.  *
  65.  *    x      := -23.99
  66.  *    cents  := str( (x - int( x )) * 100, 2, 0 ) + "/100"
  67.  *        x      := int( x )
  68.  *    string := iif( x < 0, "Credit of ", "Debit of " )
  69.  *        ? string + FT_NTOW( abs(x) ) + " Dollars and " + "99/100"
  70.  *             -> Credit of Twenty Three Dollars and 99/100
  71.  *  $END$
  72.  */
  73.  
  74.  
  75.  
  76. static ones  := { "",     " One",   " Two",   " Three", " Four", " Five",  ;
  77.                   " Six", " Seven", " Eight", " Nine"                      ;
  78.                 }
  79.                                             
  80. static teens := { " Ten",      " Eleven",    " Twelve",   ;
  81.                   " Thirteen", " Fourteen",  " Fifteen",  ;
  82.                   " Sixteen",  " Seventeen", " Eighteen", ;
  83.                   " Nineteen"                             ;
  84.                 }
  85.  
  86. static tens  :=  { "", "", " Twenty", " Thirty", " Forty", " Fifty", ;
  87.                    " Sixty", " Seventy", " Eighty", " Ninety"  }
  88.  
  89. static qualifiers := { "", " Thousand", " Million", " Billion", " Trillion" }
  90.  
  91.  
  92. #ifdef FT_TEST
  93.   function main( cNum )
  94.      return qout( ft_ntow( val( cNum ) ) )
  95. #endif
  96.  
  97.  
  98.  
  99. function ft_ntow(nAmount)
  100.   local nTemp, sResult := " ", nQualNo
  101.   local nDiv := 10 ^ ( int( sol10(nAmount) / 3 ) * 3 )
  102.  
  103.   nTemp   := int(nAmount % nDiv)
  104.   nAmount := int(nAmount / nDiv)
  105.   nQualNo := int( sol10( nDiv ) / 3 ) + 1
  106.   sResult += grp_to_words(nAmount, qualifiers[ nQualNo ] )
  107.  
  108.   if nTemp > (nDiv /= 1000) .and. (nDiv > 1)
  109.      sResult += ft_ntow( nTemp, nDiv )
  110.   else
  111.        sResult += grp_to_words(nTemp, "")
  112.   endif
  113.   return( ltrim(sResult) )
  114.  
  115.  
  116. static function grp_to_words(nGrp, sQual)
  117.   local sResult := "", nTemp
  118.  
  119.   nTemp   := int(nGrp % 100)
  120.   nGrp    := int(nGrp / 100)
  121.   sResult += ones[ nGrp + 1 ] + iif( nGrp > 0, " Hundred", "")
  122.  
  123.   do case
  124.        case nTemp > 19
  125.            sResult += tens[ int( nTemp / 10 ) + 1 ]
  126.           sResult += ones[ int( nTemp % 10 ) + 1 ]
  127.      case nTemp < 20 .and. nTemp > 9
  128.            sResult += teens[ int( nTemp % 10 ) + 1 ]
  129.      case nTemp < 10 .and. nTemp > 0
  130.            sResult += ones[ int( nTemp) + 1 ]
  131.   endcase
  132.   return(sResult + sQual)
  133.  
  134.  
  135. static function sol10( nNumber )
  136.   local sTemp
  137.  
  138.   sTemp := ltrim( str( int(nNumber), 0) )
  139.   return( len(sTemp) - 1 )
  140.