RosettaCodeData/Task/Number-names/BBC-BASIC/number-names.basic

41 lines
1.6 KiB
Plaintext

DIM test%(20)
test%() = 0, 1, 2, 19, 20, 21, 99, 100, 101, 300, 310, 1001, -1327, 1501, \
\ 10203, 12609, 101104, 102003, 467889, 1005006, -123000789
FOR i% = 0 TO DIM(test%(),1)
PRINT FNsaynumber(test%(i%))
NEXT
END
DEF FNsaynumber(n%)
LOCAL number%(), number$(), i%, t%, a$
DIM number%(29), number$(29)
number%() = 1000000000, 1000000, 1000, 100, 90, 80, 70, 60, 50, 40, 30, 20, \
\ 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2
number$() = "billion", "million", "thousand", "hundred", "ninety", "eighty", \
\ "seventy", "sixty", "fifty", "forty", "thirty", "twenty", \
\ "nineteen", "eighteen", "seventeen", "sixteen", "fifteen", \
\ "fourteen", "thirteen", "twelve", "eleven", "ten", "nine", \
\ "eight", "seven", "six", "five", "four", "three", "two"
IF n% < 0 THEN = "minus " + FNsaynumber(-n%)
IF n% = 0 THEN = "zero"
IF n% = 1 THEN = "one "
FOR i% = 0 TO DIM(number%(),1)
IF n% >= number%(i%) THEN
t% = n% DIV number%(i%)
IF t%=1 AND i%<4 a$ += "one " ELSE IF t%<>1 a$ += FNsaynumber(t%)
a$ += number$(i%)
t% = n% MOD number%(i%)
CASE TRUE OF
WHEN i%>3 AND i%<12 AND t%<>0: a$ += "-"
WHEN i%<=3 AND t%>=100: a$ += ", "
WHEN i%<=3 AND t%<>0 AND t%<100: a$ += " and "
OTHERWISE: a$ += " "
ENDCASE
IF t% a$ += FNsaynumber(t%) ELSE IF i%<12 a$ += " "
EXIT FOR
ENDIF
NEXT i%
= a$