from django import template
register = template.Library()
def number_format(number, decimals=0, dec_point='.', thousands_sep=','):
try:
number = round(float(number), decimals)
except ValueError:
return number
neg = number < 0
integer, fractional = str(abs(number)).split('.')
m = len(integer) % 3
if m:
parts = [integer[:m]]
else:
parts = []
parts.extend([integer[m+t:m+t+3] for t in xrange(0, len(integer[m:]), 3)])
if decimals:
return '%s%s%s%s' % (
neg and '-' or '',
thousands_sep.join(parts),
dec_point,
fractional.ljust(decimals, '0')[:decimals]
)
else:
return '%s%s' % (neg and '-' or '', thousands_sep.join(parts))
register.filter(number_format)
Comments
I use this in combination with the decimal.quantize filter (http://www.djangosnippets.org/snippets/1468/). Usually I run quantize, then the number format, because quantize will take care of rounding which is needed for precision with monetary numbers.
#