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