home *** CD-ROM | disk | FTP | other *** search
- /*
- * File......: NTOW.PRG
- * Author....: Gary Baren
- * CIS ID....: 75470,1027
- * Date......: $Date: 15 Aug 1991 23:05:54 $
- * Revision..: $Revision: 1.1 $
- * Log file..: $Logfile: E:/nanfor/src/ntow.prv $
- *
- * This is an original work by Gary Baren and is hereby placed in the
- * public domain.
- *
- * Modification history:
- * ---------------------
- *
- * $Log: E:/nanfor/src/ntow.prv $
- *
- * Rev 1.1 15 Aug 1991 23:05:54 GLENN
- * Forest Belt proofread/edited/cleaned up doc
- *
- * Rev 1.0 09 Jun 1991 00:26:56 GLENN
- * Initial revision.
- *
- */
-
-
-
-
- /* $DOC$
- * $FUNCNAME$
- * FT_NTOW()
- * $CATEGORY$
- * Conversion
- * $ONELINER$
- * Translate numeric value to words
- * $SYNTAX$
- * FT_NTOW( <nNumber> ) -> cWords
- * $ARGUMENTS$
- * <nNumber> An integer to translate
- * $RETURNS$
- * A text string representing <nNumber>
- * $DESCRIPTION$
- * Translates numeric input to a text string.
- *
- * FT_NTOW is intended to be used with integers only. Since I don't
- * know what your application will be, I can't assume the type of
- * fraction you want returned (ninety nine cents, 99/100, .99, etc).
- * If you want the fraction in words, just pass it as an integer.
- *
- * Do not pass a negative number! Handle negative numbers any way
- * you need to in your code. (ie: CR, DB, Negative, Minus, etc.)
- *
- * Also, numeric 0 is returned as a null string. You will need to
- * make a decision how to output it (zero dollars, no dollars, etc).
- * $EXAMPLES$
- * ? FT_NTOW( 999 ) -> Nine Hundred Ninety Nine
- *
- * ? FT_NTOW( 1000 ) -> One Thousand
- *
- * ? FT_NTOW( 23 ) + " Dollars and " + FT_NTOW( 99 ) + " Cents"
- * -> Twenty Three Dollars and Ninety Nine Cents
- *
- * ? FT_NTOW( 23 ) + " Dollars and " + "99/100"
- * -> Twenty Three Dollars and 99/100
- *
- * x := -23.99
- * cents := str( (x - int( x )) * 100, 2, 0 ) + "/100"
- * x := int( x )
- * string := iif( x < 0, "Credit of ", "Debit of " )
- * ? string + FT_NTOW( abs(x) ) + " Dollars and " + "99/100"
- * -> Credit of Twenty Three Dollars and 99/100
- * $END$
- */
-
-
-
- static ones := { "", " One", " Two", " Three", " Four", " Five", ;
- " Six", " Seven", " Eight", " Nine" ;
- }
-
- static teens := { " Ten", " Eleven", " Twelve", ;
- " Thirteen", " Fourteen", " Fifteen", ;
- " Sixteen", " Seventeen", " Eighteen", ;
- " Nineteen" ;
- }
-
- static tens := { "", "", " Twenty", " Thirty", " Forty", " Fifty", ;
- " Sixty", " Seventy", " Eighty", " Ninety" }
-
- static qualifiers := { "", " Thousand", " Million", " Billion", " Trillion" }
-
-
- #ifdef FT_TEST
- function main( cNum )
- return qout( ft_ntow( val( cNum ) ) )
- #endif
-
-
-
- function ft_ntow(nAmount)
- local nTemp, sResult := " ", nQualNo
- local nDiv := 10 ^ ( int( sol10(nAmount) / 3 ) * 3 )
-
- nTemp := int(nAmount % nDiv)
- nAmount := int(nAmount / nDiv)
- nQualNo := int( sol10( nDiv ) / 3 ) + 1
- sResult += grp_to_words(nAmount, qualifiers[ nQualNo ] )
-
- if nTemp > (nDiv /= 1000) .and. (nDiv > 1)
- sResult += ft_ntow( nTemp, nDiv )
- else
- sResult += grp_to_words(nTemp, "")
- endif
- return( ltrim(sResult) )
-
-
- static function grp_to_words(nGrp, sQual)
- local sResult := "", nTemp
-
- nTemp := int(nGrp % 100)
- nGrp := int(nGrp / 100)
- sResult += ones[ nGrp + 1 ] + iif( nGrp > 0, " Hundred", "")
-
- do case
- case nTemp > 19
- sResult += tens[ int( nTemp / 10 ) + 1 ]
- sResult += ones[ int( nTemp % 10 ) + 1 ]
- case nTemp < 20 .and. nTemp > 9
- sResult += teens[ int( nTemp % 10 ) + 1 ]
- case nTemp < 10 .and. nTemp > 0
- sResult += ones[ int( nTemp) + 1 ]
- endcase
- return(sResult + sQual)
-
-
- static function sol10( nNumber )
- local sTemp
-
- sTemp := ltrim( str( int(nNumber), 0) )
- return( len(sTemp) - 1 )