English is a peculiar language. english_number() takes an integer, and returns the long, written form most famously used on checks and the like. Algorithm inspired by some old HP online docs.
1
2 to_19 = ( 'zero', 'one', 'two', 'three', 'four', 'five', 'six',
3 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen',
4 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen' )
5 tens = ( 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety')
6 denom = ( '',
7 'thousand', 'million', 'billion', 'trillion', 'quadrillion',
8 'quintillion', 'sextillion', 'septillion', 'octillion', 'nonillion',
9 'decillion', 'undecillion', 'duodecillion', 'tredecillion', 'quattuordecillion',
10 'sexdecillion', 'septendecillion', 'octodecillion', 'novemdecillion', 'vigintillion' )
11
12
13 def _convert_nn(val):
14 if val < 20:
15 return to_19[val]
16 for (dcap, dval) in ((k, 20 + (10 * v)) for (v, k) in enumerate(tens)):
17 if dval + 10 > val:
18 if val % 10:
19 return dcap + '-' + to_19[val % 10]
20 return dcap
21
22
23
24
25 def _convert_nnn(val):
26 word = ''
27 (mod, rem) = (val % 100, val // 100)
28 if rem > 0:
29 word = to_19[rem] + ' hundred'
30 if mod > 0:
31 word = word + ' '
32 if mod > 0:
33 word = word + _convert_nn(mod)
34 return word
35
36 def english_number(val):
37 if val < 100:
38 return _convert_nn(val)
39 if val < 1000:
40 return _convert_nnn(val)
41 for (didx, dval) in ((v - 1, 1000 ** v) for v in range(len(denom))):
42 if dval > val:
43 mod = 1000 ** didx
44 l = val // mod
45 r = val - (l * mod)
46 ret = _convert_nnn(l) + ' ' + denom[didx]
47 if r > 0:
48 ret = ret + ', ' + english_number(r)
49 return ret
50