Make sure the money formatting recipe can doesn't run out of digits

to the right of the decimal point.
This commit is contained in:
Raymond Hettinger 2004-11-25 04:47:09 +00:00
parent 7a8173a477
commit 3de9aa40ec
1 changed files with 14 additions and 8 deletions

View File

@ -979,12 +979,12 @@ def moneyfmt(value, places=2, curr='', sep=',', dp='.',
places: required number of places after the decimal point
curr: optional currency symbol before the sign (may be blank)
sep: optional grouping separator (comma, period, or blank)
sep: optional grouping separator (comma, period, space, or blank)
dp: decimal point indicator (comma or period)
only specify as blank when places is zero
pos: optional sign for positive numbers: "+", space or blank
neg: optional sign for negative numbers: "-", "(", space or blank
trailneg:optional trailing minus indicator: "-", ")", space or blank
pos: optional sign for positive numbers: '+', space or blank
neg: optional sign for negative numbers: '-', '(', space or blank
trailneg:optional trailing minus indicator: '-', ')', space or blank
>>> d = Decimal('-1234567.8901')
>>> moneyfmt(d, curr='$')
@ -993,19 +993,25 @@ def moneyfmt(value, places=2, curr='', sep=',', dp='.',
'1.234.568-'
>>> moneyfmt(d, curr='$', neg='(', trailneg=')')
'($1,234,567.89)'
>>> moneyfmt(Decimal(123456))
'123,456.00'
>>> moneyfmt(Decimal(123456789), sep=' ')
'123 456 789.00'
>>> moneyfmt(Decimal('-0.02'), neg='<', trailneg='>')
'<.02>'
"""
q = Decimal((0, (1,), -places)) # 2 places --> '0.01'
sign, digits, exp = value.quantize(q).as_tuple()
assert exp == -places
result = []
digits = map(str, digits)
build, next = result.append, digits.pop
if sign:
build(trailneg)
for i in range(places):
build(next())
if digits:
build(next())
else:
build('0')
build(dp)
i = 0
while digits: