Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) [GCC 4.5.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from decimal import * >>> getcontext().prec = 2 >>> def moneyfmt(value, places=2, curr='', sep=',', dp='.', ... pos='', neg='-', trailneg=''): ... """Convert Decimal to a money formatted string. ... ... 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, 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 ... ... >>> d = Decimal('-1234567.8901') ... >>> moneyfmt(d, curr='$') ... '-$1,234,567.89' ... >>> moneyfmt(d, places=0, sep='.', dp='', neg='', trailneg='-') ... '1.234.568-' ... >>> moneyfmt(d, curr='$', neg='(', trailneg=')') ... '($1,234,567.89)' ... >>> moneyfmt(Decimal(123456789), sep=' ') ... '123 456 789.00' ... >>> moneyfmt(Decimal('-0.02'), neg='<', trailneg='>') ... '<0.02>' ... ... """ ... q = Decimal(10) ** -places # 2 places --> '0.01' ... sign, digits, exp = value.quantize(q).as_tuple() ... result = [] ... digits = map(str, digits) ... build, next = result.append, digits.pop ... if sign: ... build(trailneg) ... for i in range(places): ... build(next() if digits else '0') ... build(dp) ... if not digits: ... build('0') ... i = 0 ... while digits: ... build(next()) ... i += 1 ... if i == 3 and digits: ... i = 0 ... build(sep) ... build(curr) ... build(neg if sign else pos) ... return ''.join(reversed(result)) ... >>> d = Decimal('-1234567.8901') >>> moneyfmt(d, curr='$') Traceback (most recent call last): File "", line 1, in File "", line 28, in moneyfmt File "/usr/lib/python2.7/decimal.py", line 2430, in quantize 'quantize result has too many digits for current context') File "/usr/lib/python2.7/decimal.py", line 3844, in _raise_error raise error(explanation) decimal.InvalidOperation: quantize result has too many digits for current context >>>