1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
def numify(number, singular=None, plural=None):
"""Turn a number into a word if less than 13 and optionally add a singular or plural word
>>> numify(3)
'three'
>>> numify(1, 'item', 'items')
'one item'
>>> numify(9, 'book', 'books')
'nine books'
You can add capitalize to change the capitalization
>>> numify(9, 'book', 'books').capitalize()
'Nine books'
Or capitalize every word using title
>>> numify(9, 'book', 'books').title()
'Nine Books'
>>> numify(15)
'15'
>>> numify(0)
'0'
>>> numify(12334, 'hippopotamus', 'hippopotami')
'12,334 hippopotami'
"""
num_repr = {0 : "zero",
1 : "one",
2 : "two",
3 : "three",
4 : "four",
5 : "five",
6 : "six",
7 : "seven",
8 : "eight",
9 : "nine",
10 : "ten",
11 : "eleven",
12 : "twelve"}
#Below line commented out cause doesn't work in Python 2.4
#assert all((singular, plural)) or not any((singular, plural)), "Need to pass two words or none"
if number == 1:
word = singular
else:
word = plural
if number in num_repr:
number = num_repr[number]
elif number > 9999:
number = commify(number)
if word:
return "%s %s" % (number, word)
else:
return str(number)
def commify(n):
"""Add commas to an integer n.
See http://stackoverflow.com/questions/3909457/whats-the-easiest-way-to-add-commas-to-an-integer-in-python
But I (Sam) made some small changes based on http://www.grammarbook.com/numbers/numbers.asp
>>> commify(1)
'1'
>>> commify(123)
'123'
>>> commify(1234)
'1234'
>>> commify(12345)
'12,345'
>>> commify(1234567890)
'1,234,567,890'
>>> commify(123.0)
'123.0'
>>> commify(1234.5)
'1234.5'
>>> commify(1234.56789)
'1234.56789'
>>> commify(123456.789)
'123,456.789'
>>> commify('%.2f' % 1234.5)
'1234.50'
>>> commify(None)
>>>
"""
if n is None:
return None
n = str(n)
if len(n) <= 4: # Might as well do this early
return n
if '.' in n:
dollars, cents = n.split('.')
else:
dollars, cents = n, None
# Don't commify numbers less than 10000
if len(dollars) <= 4:
return n
r = []
for i, c in enumerate(reversed(str(dollars))):
if i and (not (i % 3)):
r.insert(0, ',')
r.insert(0, c)
out = ''.join(r)
if cents:
out += '.' + cents
return out
if __name__ == '__main__':
import doctest
doctest.testmod()
|