diff --git a/django/template/defaultfilters.py b/django/template/defaultfilters.py index b258cf269b..a1f96f5e2e 100644 --- a/django/template/defaultfilters.py +++ b/django/template/defaultfilters.py @@ -134,7 +134,7 @@ def floatformat(text, arg=-1): """ try: - input_val = force_text(text) + input_val = repr(text) d = Decimal(input_val) except UnicodeEncodeError: return '' @@ -165,7 +165,8 @@ def floatformat(text, arg=-1): try: # Set the precision high enough to avoid an exception, see #15789. tupl = d.as_tuple() - units = len(tupl[1]) - tupl[2] + units = len(tupl[1]) + units += -tupl[2] if m else tupl[2] prec = abs(p) + units + 1 # Avoid conversion to scientific notation by accessing `sign`, `digits` diff --git a/tests/template_tests/filter_tests/test_floatformat.py b/tests/template_tests/filter_tests/test_floatformat.py index d2c39d3d48..b9724a2ff3 100644 --- a/tests/template_tests/filter_tests/test_floatformat.py +++ b/tests/template_tests/filter_tests/test_floatformat.py @@ -54,6 +54,10 @@ class FunctionTests(SimpleTestCase): self.assertEqual(floatformat('foo', 'bar'), '') self.assertEqual(floatformat('¿Cómo esta usted?'), '') self.assertEqual(floatformat(None), '') + self.assertEqual(floatformat(-1.323297138040798e+35, 2), '-132329713804079800000000000000000000.00') + self.assertEqual(floatformat(-1.323297138040798e+35, -2), '-132329713804079800000000000000000000') + self.assertEqual(floatformat(1.5e-15, 20), '0.00000000000000150000') + self.assertEqual(floatformat(1.5e-15, -20), '0.00000000000000150000') def test_zero_values(self): self.assertEqual(floatformat(0, 6), '0.000000')