[Tutor] Text numerals?

Bob Gailer bgailer at alum.rpi.edu
Sun May 16 12:26:52 EDT 2004

```At 11:42 PM 5/15/2004, Don Arnold wrote:

> > Is there a function that will return 'one' for 1, 'two' for two, etc.?
> >
>
>   I assume you mean 'two' for 2 ;).  But no, AFAIK there is no stdlib
>implementation.
>
><snip dictionary suggestions>
>
>   The problem of converting full-blown numbers of any length into letters is
>much harder.  Some years ago I remember this being coded in python; if the
>
>   But make sure you need that kind of complexity; better to have a solution
>you understand than one which is too powerful that you don't.  It helps when
>things go wrong ;).
>
>--
>Glen
>
>
>
>Good advice, but this problem turned out not to be as complex as it first
>appeared. Really, all you need to do is pad the number to a length that's
>divisible by 3 and then start processing digits from the left, three at a
>time. Here's my take on it:

In the (for me) inevitable pursuit of programming alternatives, here's a
list/numeric version of Don's solution.

littleNumbers = [' ', 'one', 'two', 'three', 'four', 'five', 'six', 'seven',
'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen',
'fourteen', 'fifteen', 'sixteen', 'seventeen',
'eighteen', 'nineteen']

tens = ['', '', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy',
'eighty', 'ninety']

groupings = ['', ' thousand', ' million', ' billion', ' trillion', '
' quintillion', ' sextillion', ' septillion', ' octillion', '
nonillion', ' decillion']

def main(num):
maxGroups = 12
maxDigits = maxGroups * 3
if num >= 10**maxDigits:raise 'Number must have at most %s digits.' %
(maxDigits,)
result = []
sign = ('', 'negative ')[num<0]
num = abs(num)
groupSep = ''
for group in range(0,12):
if not num: break
num, thousandsGroup = divmod(num, 1000)
if thousandsGroup:
if group:result.append(groupings[group] + groupSep)
groupSep = ', '
hundred, unitTen = divmod(thousandsGroup, 100)
if unitTen < 20:
result.append(littleNumbers[unitTen])
else:
result.append(littleNumbers[unitTen%10])
if unitTen%10: result.append('-')
result.append(tens[unitTen/10])
if hundred:
result.append(littleNumbers[hundred] + ' hundred ')
result.reverse()
return sign + ''.join(result) or 'zero'
[snip]

Bob Gailer
bgailer at alum.rpi.edu
303 442 2625 home
720 938 2625 cell

```