Login

Quantize decimal template filter

Author:
bl4th3rsk1t3
Posted:
April 27, 2009
Language:
Python
Version:
1.0
Score:
1 (after 1 ratings)

Takes a float number (23.456) and uses the decimal.quantize to round it to a fixed exponent. This allows you to specify the exponent precision, along with the rounding method. And is perfect for monetary formatting taking into account precision.

 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
import decimal
from django import template
from django.template.defaultfilters import stringfilter
register=template.Library()

@register.filter
def quantize(value,arg=None):
	"""
	Takes a float number (23.456) and uses the
	decimal.quantize to round it to a fixed
	exponent. This allows you to specify the
	exponent precision, along with the
	rounding method.
		
	Examples (assuming value="7.325"):
	{% value|quantize %} -> 7.33
	{% value|quantize:".01,ru" %} -> 7.33 (this is the same as the default behavior)
	{% value|quantize:".01,rd" %} -> 7.32
	
	Available rounding options (taken from the decimal module):
	ROUND_CEILING (rc), ROUND_DOWN (rd), ROUND_FLOOR (rf), ROUND_HALF_DOWN (rhd),
	ROUND_HALF_EVEN (rhe), ROUND_HALF_UP (rhu), and ROUND_UP (ru)
	
	Arguments cannot have spaces in them.
	
	See the decimal module for more info:
	http://docs.python.org/library/decimal.html
	"""
	num=decimal.Decimal(str(value))
	options=["ru","rf","rd","rhd","rhe","rhu"]
	precision=None;rounding=None
	if arg:
		args=arg.split(",")
		precision=args[0]
		rounding=str(args[1])
	if not precision: precision=".01"
	if not rounding: rounding=decimal.ROUND_UP
	if rounding not in options: rounding=decimal.ROUND_UP
	if rounding=="ru":rounding=decimal.ROUND_UP
	elif rounding=="rf": rounding=decimal.ROUND_FLOOR
	elif rounding=="rd": rounding=decimal.ROUND_DOWN
	elif rounding=="rhd": rounding=decimal.ROUND_HALF_DOWN
	elif rounding=="rhe": rounding=decimal.ROUND_HALF_EVEN
	elif rounding=="rhu": rounding=decimal.ROUND_HALF_UP
	newnum=num.quantize(decimal.Decimal(precision),rounding=rounding)
	return newnum

More like this

  1. Template tag - list punctuation for a list of items by shapiromatron 10 months, 1 week ago
  2. JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 10 months, 2 weeks ago
  3. Serializer factory with Django Rest Framework by julio 1 year, 5 months ago
  4. Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 6 months ago
  5. Help text hyperlinks by sa2812 1 year, 6 months ago

Comments

Please login first before commenting.