62 lines
1.7 KiB
Text
62 lines
1.7 KiB
Text
module Number_names {
|
|
numname=lambda ->{
|
|
flush
|
|
data "", "one", "two", "three", "four"
|
|
data "five", "six", "seven", "eight", "nine", "ten"
|
|
data "eleven", "twelve", "thirteen", "fourteen", "fifteen"
|
|
data "sixteen", "seventeen","eighteen", "nineteen"
|
|
dim lows(), tens(), lev()
|
|
lows()=array([])
|
|
data "", "", "twenty", "thirty", "forty","fifty", "sixty"
|
|
data "seventy", "eighty", "ninety"
|
|
tens()=array([])
|
|
lev()=("", "thousand", "million", "billion")
|
|
numname_int=lambda lows(), tens(), lev() (n as long) -> {
|
|
if n=0 then ="zero": exit
|
|
long tr[0], t=-1, i
|
|
string ret, prefix
|
|
if n < 0 then prefix= "negative ": n-! else prefix=""
|
|
while n>0
|
|
t++
|
|
tr[t]= n mod 1000
|
|
n|div 1000
|
|
end while
|
|
for i=t to 0
|
|
tripn=""
|
|
if tr[i]=0 then continue for
|
|
lt= tr[i] mod 100
|
|
h= tr[i] div 100
|
|
if lt<20 then
|
|
tripn+=lows(lt)
|
|
else
|
|
tripn=tens(lt div 10)+if$(lt mod 10 >0 ->"-"+lows(lt mod 10),"")
|
|
end if
|
|
if h>0 then
|
|
if lt>0 then tripn = " and " + tripn
|
|
tripn = lows(h)+" hundred" + tripn
|
|
end if
|
|
if i=0 and t>0 and h = 0 then tripn = "and " + tripn
|
|
ret += tripn+" "+lev(i)+" "
|
|
next i
|
|
=prefix+trim$(ret)
|
|
}
|
|
=lambda numname_int (n as currency) ->{
|
|
if int(n)=n then =numname_int(n): exit
|
|
string prefix= numname_int(int(abs(n)))+" point "
|
|
string decdig = str$(abs(n)-int(abs(n))), ret
|
|
if n<0 then prefix="negative "+prefix
|
|
ret=prefix
|
|
for i = 3 to len(decdig)
|
|
ret+=lambda(val(mid$(decdig, i, 1)))+" "
|
|
next i
|
|
=trim$(ret)
|
|
}
|
|
}() 'execute here so we get the inner lambda
|
|
report numname(0)
|
|
report numname(1.0)
|
|
report numname(-1.7)
|
|
report numname(910000)
|
|
report numname(987654)
|
|
report numname(100000017)
|
|
}
|
|
Number_names
|