diff --git a/django/template/defaultfilters.py b/django/template/defaultfilters.py
index 3606942..8bc4f12 100644
a
|
b
|
|
3 | 3 | import re |
4 | 4 | import random as random_module |
5 | 5 | import unicodedata |
6 | | from decimal import Decimal, InvalidOperation, ROUND_HALF_UP |
| 6 | from decimal import Decimal, InvalidOperation, Context, ROUND_HALF_UP |
7 | 7 | from functools import wraps |
8 | 8 | from pprint import pformat |
9 | 9 | |
… |
… |
def floatformat(text, arg=-1):
|
156 | 156 | else: |
157 | 157 | exp = Decimal(u'1.0') / (Decimal(10) ** abs(p)) |
158 | 158 | try: |
| 159 | # Set the precission to the necessary digits to avoid an exception. |
| 160 | tupl = d.as_tuple() |
| 161 | units = len(tupl[1]) - tupl[2] |
| 162 | prec = abs(arg) + units + 1 |
| 163 | |
159 | 164 | # Avoid conversion to scientific notation by accessing `sign`, `digits` |
160 | 165 | # and `exponent` from `Decimal.as_tuple()` directly. |
161 | | sign, digits, exponent = d.quantize(exp, ROUND_HALF_UP).as_tuple() |
| 166 | sign, digits, exponent = d.quantize(exp, ROUND_HALF_UP, |
| 167 | Context(prec=prec)).as_tuple() |
162 | 168 | digits = [unicode(digit) for digit in reversed(digits)] |
163 | 169 | while len(digits) <= abs(exponent): |
164 | 170 | digits.append(u'0') |
diff --git a/tests/regressiontests/defaultfilters/tests.py b/tests/regressiontests/defaultfilters/tests.py
index cbd4776..8a557d8 100644
a
|
b
|
|
1 | 1 | # -*- coding: utf-8 -*- |
2 | 2 | from __future__ import with_statement |
3 | 3 | import datetime |
| 4 | import decimal |
4 | 5 | from django.test import TestCase |
5 | 6 | from django.utils import unittest, translation |
6 | 7 | |
… |
… |
class DefaultFiltersTests(TestCase):
|
18 | 19 | self.assertEqual(floatformat(7.7, 3), u'7.700') |
19 | 20 | self.assertEqual(floatformat(6.000000, 3), u'6.000') |
20 | 21 | self.assertEqual(floatformat(6.200000, 3), u'6.200') |
| 22 | self.assertEqual(floatformat(5555.555, 2), u'5555.56') |
| 23 | self.assertEqual(floatformat(001.3000, 2), u'1.30') |
| 24 | self.assertEqual(floatformat(0.12345, 2), u'0.12') |
21 | 25 | self.assertEqual(floatformat(6.200000, -3), u'6.200') |
22 | 26 | self.assertEqual(floatformat(13.1031, -3), u'13.103') |
23 | 27 | self.assertEqual(floatformat(11.1197, -2), u'11.12') |
… |
… |
class DefaultFiltersTests(TestCase):
|
31 | 35 | self.assertEqual(floatformat(u'¿Cómo esta usted?'), u'') |
32 | 36 | self.assertEqual(floatformat(None), u'') |
33 | 37 | |
| 38 | # Ignore the precision of decimal context. |
| 39 | decimal.getcontext().prec = 2 |
| 40 | self.assertEqual(floatformat(1.2345, 2), u'1.23') |
| 41 | self.assertEqual(floatformat(15.2042, -3), u'15.204') |
| 42 | |
34 | 43 | # Check that we're not converting to scientific notation. |
35 | 44 | self.assertEqual(floatformat(0, 6), u'0.000000') |
36 | 45 | self.assertEqual(floatformat(0, 7), u'0.0000000') |