(phixonline)-->
--
-- demo\rosetta\Number_names.exw
-- -----------------------------
--
with javascript_semantics
constant twenties = {"zero","one","two","three","four","five","six","seven","eight","nine","ten",
"eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"}
function twenty(integer n)
return twenties[mod(n,20)+1]
end function
constant decades = {"twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"}
function decade(integer n)
return decades[mod(n,10)-1]
end function
function hundred(integer n)
if n<20 then
return twenty(n)
elsif mod(n,10)=0 then
return decade(mod(floor(n/10),10))
end if
return decade(floor(n/10)) & '-' & twenty(mod(n,10))
end function
function thousand(integer n, string withand)
if n<100 then
return withand & hundred(n)
elsif mod(n,100)=0 then
return withand & twenty(floor(n/100))&" hundred"
end if
return twenty(floor(n/100)) & " hundred and " & hundred(mod(n,100))
end function
constant orders = {{power(10,15),"quadrillion"},
{power(10,12),"trillion"},
{power(10,9),"billion"},
{power(10,6),"million"},
{power(10,3),"thousand"}}
function triplet(atom n)
string res = ""
for i=1 to length(orders) do
{atom order, string name} = orders[i]
atom high = floor(n/order),
low = mod(n,order)
if high!=0 then
res &= thousand(high,"")&' '&name
end if
n = low
if low=0 then exit end if
if length(res) and high!=0 then
res &= ", "
end if
end for
if n!=0 or res="" then
res &= thousand(floor(n),iff(res=""?"":"and "))
n = abs(mod(n,1))
if n>1e-6 then
res &= " point"
for i=1 to 10 do
integer t = floor(n*10.0000001)
res &= ' '&twenties[t+1]
n = n*10-t
if abs(n)<1e-6 then exit end if
end for
end if
end if
return res
end function
global
function spell(atom n)
string res = ""
if n<0 then
res = "minus "
n = -n
end if
res &= triplet(n)
return res
end function
global
constant samples = {99, 300, 310, 417,1_501, 12_609, 200000000000100, 999999999999999,
-123456787654321,102003000400005,1020030004,102003,102,1,0,-1,-99,
-1501,1234,12.34,10000001.2,1E-3,-2.7182818,
201021002001,-20102100200,2010210020,-201021002,20102100,-2010210,
201021,-20102,2010,-201,20,-2}
global
function smartp(atom n)
if n=floor(n) then return sprintf("%d",n) end if
string res = sprintf("%18.8f",n)
if find('.',res) then
res = trim_tail(res,"0")
end if
return res
end function
procedure main()
for i=1 to length(samples) do
atom si = samples[i]
printf(1,"%18s %s\n",{smartp(si),spell(si)})
end for
end procedure
if include_file()=1 then
main()
{} = wait_key()
end if