templatetags: beautify decimal filter's code (#30852)

This commit is contained in:
Nicolas Roche 2019-02-22 17:58:27 +01:00
parent 144fad9847
commit e4ee1a902b
2 changed files with 12 additions and 13 deletions

View File

@ -286,20 +286,20 @@ def test_variable_unicode_error_handling():
def test_decimal_templatetag():
tmpl = Template('{{ plop|decimal }}')
assert tmpl.render({'plop': 'toto'}) == ''
assert tmpl.render({'plop': 'toto'}) == '0'
assert tmpl.render({'plop': '3.14'}) == '3.14'
assert tmpl.render({'plop': '3,14'}) == '3.14'
assert tmpl.render({'plop': 3.14}) == '3.14'
assert tmpl.render({'plop': 12345.678}) == '12345.678'
assert tmpl.render({'plop': None}) == ''
assert tmpl.render({'plop': None}) == '0'
assert tmpl.render({'plop': 0}) == '0'
tmpl = Template('{{ plop|decimal:3 }}')
assert tmpl.render({'plop': '3.14'}) == '3.140'
assert tmpl.render({'plop': None}) == ''
assert tmpl.render({'plop': None}) == '0.000'
tmpl = Template('{{ plop|decimal:"3" }}')
assert tmpl.render({'plop': '3.14'}) == '3.140'
assert tmpl.render({'plop': None}) == ''
assert tmpl.render({'plop': None}) == '0.000'
tmpl = Template('{% if plop|decimal > 2 %}hello{% endif %}')
assert tmpl.render({'plop': 3}) == 'hello'
@ -309,8 +309,9 @@ def test_decimal_templatetag():
assert tmpl.render({'plop': 1}) == ''
assert tmpl.render({'plop': 1.99}) == ''
assert tmpl.render({'plop': '1.99'}) == ''
assert tmpl.render({'plop': 'x'}) == 'hello'
assert tmpl.render({'plop': None}) == 'hello' # will be str > int, always True.
assert tmpl.render({'plop': 'x'}) == ''
assert tmpl.render({'plop': None}) == ''
assert tmpl.render({'plop': 0}) == ''
tmpl = Template('{% if "3"|decimal == 3 %}hello{% endif %}')
assert tmpl.render() == 'hello'

View File

@ -112,26 +112,24 @@ def time(value, arg=None):
return defaultfilters.date(value, arg=arg)
def parse_decimal(value):
if hasattr(value, 'get_value'):
value = value.get_value() # unlazy
if isinstance(value, basestring):
# replace , by . for French users comfort
value = value.replace(',', '.')
try:
return Decimal(value).quantize(Decimal('1.0000')).normalize()
except (ArithmeticError, TypeError):
return None
return Decimal(0)
@register.filter(is_safe=False)
def decimal(value, arg=None):
if hasattr(value, 'get_value'):
value = value.get_value() # unlazy
if not isinstance(value, Decimal):
value = parse_decimal(value)
if value is None:
return ''
if hasattr(arg, 'get_value'):
arg = arg.get_value() # unlazy
if arg is None:
return value
if hasattr(arg, 'get_value'):
arg = arg.get_value() # unlazy
return defaultfilters.floatformat(value, arg=arg)
@register.filter(expects_localtime=True, is_safe=False)