Number names: Difference between revisions

Add BCPL
(Add PL/M)
(Add BCPL)
Line 1,073:
minus one hundred and twenty-three million, seven hundred and eighty-nine
</pre>
 
=={{header|BCPL}}==
This will work up to and including 999999, or up to the maximum of the system word size, whichever is smaller.
 
<lang bcpl>get "libhdr"
manifest $( MAXLEN = 256/BYTESPERWORD $)
 
let append(v1, v2) be
$( for i=1 to v2%0 do
v1%(v1%0+i) := v2%i
v1%0 := v1%0 + v2%0
$)
 
let spell(n, v) = valof
$( let small(n) =
n=0 -> "", n=1 -> "one", n=2 -> "two",
n=3 -> "three", n=4 -> "four", n=5 -> "five",
n=6 -> "six", n=7 -> "seven", n=8 -> "eight",
n=9 -> "nine", n=10 -> "ten", n=11 -> "eleven",
n=12 -> "twelve", n=13 -> "thirteen", n=14 -> "fourteen",
n=15 -> "fifteen", n=16 -> "sixteen", n=17 -> "seventeen",
n=18 -> "eighteen", n=19 -> "nineteen", valof finish
let teens(n) =
n=2 -> "twenty", n=3 -> "thirty", n=4 -> "forty",
n=5 -> "fifty", n=6 -> "sixty", n=7 -> "seventy",
n=8 -> "eighty", n=9 -> "ninety", valof finish
let less100(n, v) be
$( if n >= 20
$( append(v, teens(n/10))
n := n rem 10
unless n=0 append(v, "-")
$)
append(v, small(n))
$)
let inner(n, v) be
$( let step(n, val, name, v) = valof
$( if n>=val
$( inner(n/val, v)
append(v, name)
unless n=val do append(v, " ")
$)
resultis n rem val
$)
test n<0
$( append(v, "minus ")
inner(-n, v)
$)
or
$( n := step(n, 1000, " thousand", v)
n := step(n, 100, " hundred", v)
less100(n, v)
$)
$)
v%0 := 0
test n=0 do append(v, "zero") or inner(n, v)
resultis v
$)
 
let reads(v) be
$( v%0 := 0
$( let c = rdch()
if c='*N' | c=endstreamch break
v%0 := v%0 + 1
v%(v%0) := c
$) repeat
$)
 
let atoi(v) = valof
$( let r = 0 and neg = false and i = 1
if v%1 = '-' then
$( i := 2
neg := true
$)
while '0' <= v%i <= '9' & i <= v%0
$( r := r*10 + v%i-'0'
i := i+1
$)
resultis neg -> -r, r
$)
 
let start() be
$( let instr = vec MAXLEN and numstr = vec MAXLEN
$( writes("Number? ")
reads(instr)
if instr%0=0 finish
writef("%N: %S*N", atoi(instr), spell(atoi(instr), numstr))
$) repeat
$)</lang>
{{out}}
<pre>Number? 0
0: zero
Number? 19
19: nineteen
Number? 65
65: sixty-five
Number? 123
123: one hundred twenty-three
Number? -456
-456: minus four hundred fifty-six
Number? 30000
30000: thirty thousand</pre>
 
=={{header|BlitzMax}}==
2,094

edits