aboutsummaryrefslogtreecommitdiff
path: root/wqflask/utility/formatting.py
blob: 1c0269e97d34b730f6ffdca480d9cbf5818b0f8e (plain)
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()