Converting numbers to words (OpenInsight Specific)
At 10 NOV 1998 06:00:37AM Jacob Ignatius wrote:
I think its unlikely but is there a function that converts numbers to words (e.g. '3' to 'three')? That would save me a bit of programming.
One way of approaching this is building strings of words ('one…ten', 'twenty one…thirty',etc). Then using the number (two digits) find the corresponding word in the appropriate string. When the number is three digits the word will have to be prefixed with 'one hundred and' or 'three hundred and', etc. Likewise for numbers 4 digits in length.
At 10 NOV 1998 09:03AM Dave Pociu wrote:
Jacob,
Here's a function I wrote a while ago to spell integers. From here you can probably extrapolate to decimals.
(if you do that, please post the code for it back in this discussion forum)
function spellnumber(number)
* * 5/2/96 by D. Pociu
* * Spells out an integer. Max integer is 99999
equ basic to "zero one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen"
equ tens to "zero ten twenty thirty fourty fifty sixty seventy eighty ninety"
spell='
if not(num(number)) then
return spellend
number=int(number)
if number 5
return ''case l=5suffix=thousand'num=2 ;** shave off first 2 digitscase l=4suffix=thousand'num=1 ;** shave off first digitcase l=3suffix=hundred'num=1 ;*** shave off one digitcase l=1 or l=2suffix='num=lcase 1return ''end case
digit=number1,num
number=numbernum+1,999
gosub spell_it
goto start
spell_it:
if (spell and spell-1,1 # ' ') then spell := " "if digit=0 and spell # '' then returnbegin casecase digit ]= 0 and digit :" ":suffixcase digit ]= 20 and digit :" ":suffixend elsespell := tens:" ":basic:" ":suffixendcase 1spell='end casereturn
At 10 NOV 1998 10:29AM Jacob Ignatius wrote:
It works like a dream!
Thanks Dave.
At 03 DEC 1998 07:40PM W.M. Collins wrote:
I did a re-write to R83 using your (D.Pociu) concept.
Should be usable/adaptable to the AREV. Program was
also posted to comp.databases.pick.
* SUBROUTINE SPELL(NUMBER,SPELL,CENTS)
* FUNCTION SPELLNUMBER(NUMBER)
* * 5/2/96 CONCEPT BY D. POCIU IN AREV
* 12/98 MODIFIED TO R83 BY W.M. COLLINS * SPELLS OUT AN INTEGER. MAX INTEGER IS 99999
*
DIM BASIC(19),TENS(9)BASIC(1)=one" ;BASIC(10)=ten"BASIC(2)=two" ;BASIC(11)=eleven"BASIC(3)=three" ;BASIC(12)=twelve"BASIC(4)=four" ;BASIC(13)=thirteen"BASIC(5)=five" ;BASIC(14)=fourteen"BASIC(6)=six" ;BASIC(15)=fifteen"BASIC(7)=seven" ;BASIC(16)=sixteen"BASIC(8)=eight" ;BASIC(17)=seventeen"BASIC(9)=nine" ;BASIC(18)=eighteen"BASIC(19)=nineteen" ;TENS(1)=ten"TENS(2)=twenty" ;TENS(6)=sixty"TENS(3)=thirty" ;TENS(7)=seventy"TENS(4)=fourty" ;TENS(8)=eighty"TENS(5)=fifty" ;TENS(9)=ninety"1*
GOSUB 5RETURNSTOP*
5 SPELL='
CENTS=FIELD(NUMBER,'.',2)IF NOT(NUM(NUMBER)) THENRETURNENDNUMBER=INT(NUMBER)IF NUMBER 5RETURNCASE L=5DIGIT1=NUMBER1,1DIGIT2=NUMBER2,1DIGIT3=NUMBER3,1DIGIT4=NUMBER4,1DIGIT5=NUMBER5,1*
CASE L=4DIGIT1=NUMBER1,1DIGIT2=NUMBER2,1DIGIT3=NUMBER3,1DIGIT4=NUMBER4,1*
CASE L=3DIGIT1=NUMBER1,1DIGIT2=NUMBER2,1DIGIT3=NUMBER3,1*
CASE L=1 OR L=2DIGIT1=NUMBER1,1DIGIT2=NUMBER2,1CASE 1RETURNEND CASE*
*NUMBER=NUMBERNUM+1,999
GOSUB 50RETURNGOTO 1*
50*
IF (SPELL AND SPELL-1,1 # ' ') THEN SPELL=SPELL:" "IF DIGIT1=0 AND SPELL # '' THEN RETURNBEGIN CASECASE L=5SUFFIX= thousand "SPELL=TENS(DIGIT1)IF DIGIT2 ] 0 THENSPELL=SPELL:BASIC(DIGIT2):" ":SUFFIXEND ELSESPELL=SPELL:" ":SUFFIXENDSUFFIX= hundred "IF DIGIT3 ] 0 THENSPELL=SPELL:BASIC(DIGIT3):" ":SUFFIXEND ELSESPELL=SPELL ;*:" ":SUFFIXENDIF DIGIT4 ] 0 THENSPELL=SPELL:TENS(DIGIT4)END ELSESPELL=SPELLENDIF DIGIT5 ] 0 THENSPELL=SPELL:BASIC(DIGIT5)END ELSESPELL=SPELLENDCASE 1END CASE*
BEGIN CASECASE L=4SUFFIX= Thousand "SPELL=BASIC(DIGIT1):SUFFIXSUFFIX= Hundred "IF DIGIT2 ] 0 THENSPELL=SPELL:BASIC(DIGIT2):" ":SUFFIXEND ELSESPELL=SPELLENDIF DIGIT3:DIGIT4 0 THENSPELL=SPELL:TENS(DIGIT3)END ELSESPELL=SPELLENDIF DIGIT4 ] 0 THENSPELL=SPELL:BASIC(DIGIT4)END ELSESPELL=SPELLEND52*
CASE 1END CASE*
BEGIN CASECASE L=3SUFFIX= Hundred "SPELL=BASIC(DIGIT1):SUFFIXIF DIGIT2:DIGIT3 0 THENSPELL=SPELL:TENS(DIGIT2)END ELSESPELL=SPELLENDIF DIGIT3 ] 0 THENSPELL=SPELL:BASIC(DIGIT3)END ELSESPELL=SPELLEND54*
CASE 1END CASE*
BEGIN CASECASE L=2IF DIGIT1:DIGIT2 0 THENSPELL=SPELL:TENS(DIGIT1)SPELL=SPELL:BASIC(DIGIT2)END ELSESPELL=SPELL:TENS(DIGIT1)END55*
CASE 1END CASE*
BEGIN CASECASE L=1SPELL=BASIC(DIGIT1)CASE 1END CASE*
PRINT 'ANS= ':SPELL:" and ":CENTS:"/100"RETURNEND
At 06 DEC 1998 06:33PM W.M. Collins wrote:
Here is a revised version of the code.
No goto's. Runs smoother.
Enjoy.
WMC
SUBROUTINE SPELLIT(NUMBER,SPELL,CENTS)* * 5/2/96 CONCEPT BY D. POCIU IN AREV
* 12/06/98 MODIFIED TO R83 BY W.M. COLLINS * SPELLS OUT AN INTEGER. MAX INTEGER IS 99999
*
DIM BASIC(19),TENS(9)BASIC(1)=one" ;BASIC(10)=ten"BASIC(2)=two" ;BASIC(11)=eleven"BASIC(3)=three" ;BASIC(12)=twelve"BASIC(4)=four" ;BASIC(13)=thirteen"BASIC(5)=five" ;BASIC(14)=fourteen"BASIC(6)=six" ;BASIC(15)=fifteen"BASIC(7)=seven" ;BASIC(16)=sixteen"BASIC(8)=eight" ;BASIC(17)=seventeen"BASIC(9)=nine" ;BASIC(18)=eighteen"BASIC(19)=nineteen" ;TENS(1)=ten"TENS(2)=twenty" ;TENS(6)=sixty"TENS(3)=thirty" ;TENS(7)=seventy"TENS(4)=fourty" ;TENS(8)=eighty"TENS(5)=fifty" ;TENS(9)=ninety"1*
GOSUB 5RETURNSTOP*
5 SPELL="
CENTS=FIELD(NUMBER,'.',2)IF NOT(NUM(NUMBER)) THENRETURNENDNUMBER=INT(NUMBER)IF NUMBER 5RETURNCASE L=5DIGIT1=NUMBER1,1DIGIT2=NUMBER2,1DIGIT3=NUMBER3,1DIGIT4=NUMBER4,1DIGIT5=NUMBER5,1*
CASE L=4DIGIT1=NUMBER1,1DIGIT2=NUMBER2,1DIGIT3=NUMBER3,1DIGIT4=NUMBER4,1*
CASE L=3DIGIT1=NUMBER1,1DIGIT2=NUMBER2,1DIGIT3=NUMBER3,1*
CASE L=1 OR L=2DIGIT1=NUMBER1,1DIGIT2=NUMBER2,1CASE 1RETURNEND CASE*
GOSUB 50RETURN*
50*
IF (SPELL AND SPELL-1,1 # ' ') THEN SPELL=SPELL:" "IF DIGIT1=0 AND SPELL # '' THEN RETURNBEGIN CASECASE L=5SUFFIX= thousand "SPELL=TENS(DIGIT1)IF DIGIT2 ] 0 THENSPELL=SPELL:BASIC(DIGIT2):" ":SUFFIXEND ELSESPELL=SPELL:" ":SUFFIXENDSUFFIX= hundred "IF DIGIT3 ] 0 THENSPELL=SPELL:BASIC(DIGIT3):" ":SUFFIXEND ELSESPELL=SPELL ;*:" ":SUFFIXENDIF DIGIT4:DIGIT5 ] 0 AND DIGIT4:DIGIT5 0 THENSPELL=SPELL:TENS(DIGIT4)END ELSESPELL=SPELLENDIF DIGIT5 ] 0 THENSPELL=SPELL:BASIC(DIGIT5)END ELSESPELL=SPELLENDCASE 1END CASE*
BEGIN CASECASE L=4SUFFIX= Thousand "SPELL=BASIC(DIGIT1):SUFFIXSUFFIX= Hundred "IF DIGIT2 ] 0 THENSPELL=SPELL:BASIC(DIGIT2):" ":SUFFIXEND ELSESPELL=SPELLENDIF DIGIT3:DIGIT4 ] 0 AND DIGIT3:DIGIT4 0 THENSPELL=SPELL:TENS(DIGIT3)END ELSESPELL=SPELLENDIF DIGIT4 ] 0 THENSPELL=SPELL:BASIC(DIGIT4)END ELSESPELL=SPELLENDCASE 1END CASE*
BEGIN CASECASE L=3SUFFIX= Hundred "SPELL=BASIC(DIGIT1):SUFFIXIF DIGIT2:DIGIT3 ] 0 AND DIGIT2:DIGIT3 0 THENSPELL=SPELL:TENS(DIGIT2)END ELSESPELL=SPELLENDIF DIGIT3 ] 0 THENSPELL=SPELL:BASIC(DIGIT3)END ELSESPELL=SPELLENDCASE 1END CASE*
BEGIN CASECASE L=2IF DIGIT2 ] 0 THENSPELL=SPELL:TENS(DIGIT1)SPELL=SPELL:BASIC(DIGIT2)END ELSESPELL=SPELL:TENS(DIGIT1)ENDIF DIGIT1:DIGIT2 ] 0 AND DIGIT1:DIGIT2 < 20 THENSPELL=BASIC(DIGIT1:DIGIT2)DIGIT2=0ENDCASE 1END CASE*
BEGIN CASECASE L=1SPELL=BASIC(DIGIT1)CASE 1END CASE*
CRT 'ANS= ':SPELL:" and ":CENTS:"/100"RETURNEND