From dd3ac9f18fe5679d37c5283cf8679904c46186c5 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Wed, 20 Oct 2021 17:57:34 +0200 Subject: [PATCH] templatetags: pass float to num2words and work with 0.5.6 (#58022) --- hobo/templatetags/hobo.py | 25 ++++++++++++++++++++----- tests/test_templatetags.py | 6 +++--- tox.ini | 2 +- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/hobo/templatetags/hobo.py b/hobo/templatetags/hobo.py index 86b19a7..a9fc29a 100644 --- a/hobo/templatetags/hobo.py +++ b/hobo/templatetags/hobo.py @@ -28,19 +28,34 @@ def unlazy(x): return x.get_value() if hasattr(x, 'get_value') else x +def parse_float(value): + value = unlazy(value) + if isinstance(value, str): + # replace , by . for French users comfort + value = value.replace(',', '.') + try: + return float(value) + except (ValueError, TypeError, OverflowError): + return '' + + @register.filter -@stringfilter def as_numeral(number): + number = parse_float(number) + if not number: + return '' try: - return num2words(unlazy(number), lang=get_language()) - except (TypeError, ValueError, decimal.InvalidOperation, OverflowError): + return num2words(number, lang=get_language()) + except (TypeError, ValueError, decimal.InvalidOperation): return '' @register.filter -@stringfilter def as_numeral_currency(number): + number = parse_float(number) + if not number: + return '' try: return num2words(unlazy(number), lang=get_language(), to='currency') - except (TypeError, ValueError, decimal.InvalidOperation, OverflowError): + except (TypeError, ValueError, decimal.InvalidOperation): return '' diff --git a/tests/test_templatetags.py b/tests/test_templatetags.py index 64ba5dd..bf1eb25 100644 --- a/tests/test_templatetags.py +++ b/tests/test_templatetags.py @@ -30,7 +30,7 @@ def test_as_numeral(settings): assert t.render(Context({'number': 10 ** 500})) == '' settings.LANGUAGE_CODE = 'fr' - assert t.render(Context({'number': 42})) == 'quarante-deux' + assert t.render(Context({'number': '42'})) == 'quarante-deux' assert t.render(Context({'number': 42.15})) == 'quarante-deux virgule un cinq' @@ -47,6 +47,6 @@ def test_as_numeral_currency(settings): assert t.render(Context({'number': 10 ** 500})) == '' settings.LANGUAGE_CODE = 'fr' - assert t.render(Context({'number': 42})) == 'quarante-deux euros et zéro centimes' + assert t.render(Context({'number': 42})) == 'quarante-deux euros' assert t.render(Context({'number': 42.15})) == 'quarante-deux euros et quinze centimes' - assert t.render(Context({'number': '1'})) == 'un euro et zéro centimes' + assert t.render(Context({'number': '1'})) == 'un euro' diff --git a/tox.ini b/tox.ini index a1b5096..c1d470e 100644 --- a/tox.ini +++ b/tox.ini @@ -55,7 +55,7 @@ deps: xmlschema<1.1 enum34<=1.1.6 psycopg2-binary<2.9 - num2words + num2words==0.5.6 black: pre-commit commands = ./getlasso3.sh -- 2.30.2