Skip to content

Commit 319e135

Browse files
committed
Fixed django#18800 -- Support numbers bigger than max float in numberformat.
Thanks to jbvsmo for the patch and Brad Pitcher for the tests.
1 parent 11cdfb3 commit 319e135

File tree

3 files changed

+50
-5
lines changed

3 files changed

+50
-5
lines changed

django/utils/numberformat.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,10 @@ def format(number, decimal_sep, decimal_pos=None, grouping=0, thousand_sep='',
2121
if isinstance(number, int) and not use_grouping and not decimal_pos:
2222
return mark_safe(six.text_type(number))
2323
# sign
24-
if float(number) < 0:
25-
sign = '-'
26-
else:
27-
sign = ''
24+
sign = ''
2825
str_number = six.text_type(number)
2926
if str_number[0] == '-':
27+
sign = '-'
3028
str_number = str_number[1:]
3129
# decimal part
3230
if '.' in str_number:
@@ -48,4 +46,3 @@ def format(number, decimal_sep, decimal_pos=None, grouping=0, thousand_sep='',
4846
int_part_gd += digit
4947
int_part = int_part_gd[::-1]
5048
return sign + int_part + dec_part
51-
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from unittest import TestCase
2+
from django.utils.numberformat import format as nformat
3+
from sys import float_info
4+
5+
6+
class TestNumberFormat(TestCase):
7+
8+
def test_format_number(self):
9+
self.assertEqual(nformat(1234, '.'), '1234')
10+
self.assertEqual(nformat(1234.2, '.'), '1234.2')
11+
self.assertEqual(nformat(1234, '.', decimal_pos=2), '1234.00')
12+
self.assertEqual(nformat(1234, '.', grouping=2, thousand_sep=','),
13+
'1234')
14+
self.assertEqual(nformat(1234, '.', grouping=2, thousand_sep=',',
15+
force_grouping=True), '12,34')
16+
self.assertEqual(nformat(-1234.33, '.', decimal_pos=1), '-1234.3')
17+
18+
def test_format_string(self):
19+
self.assertEqual(nformat('1234', '.'), '1234')
20+
self.assertEqual(nformat('1234.2', '.'), '1234.2')
21+
self.assertEqual(nformat('1234', '.', decimal_pos=2), '1234.00')
22+
self.assertEqual(nformat('1234', '.', grouping=2, thousand_sep=','),
23+
'1234')
24+
self.assertEqual(nformat('1234', '.', grouping=2, thousand_sep=',',
25+
force_grouping=True), '12,34')
26+
self.assertEqual(nformat('-1234.33', '.', decimal_pos=1), '-1234.3')
27+
28+
def test_large_number(self):
29+
most_max = ('{0}179769313486231570814527423731704356798070567525844996'
30+
'598917476803157260780028538760589558632766878171540458953'
31+
'514382464234321326889464182768467546703537516986049910576'
32+
'551282076245490090389328944075868508455133942304583236903'
33+
'222948165808559332123348274797826204144723168738177180919'
34+
'29988125040402618412485836{1}')
35+
most_max2 = ('{0}35953862697246314162905484746340871359614113505168999'
36+
'31978349536063145215600570775211791172655337563430809179'
37+
'07028764928468642653778928365536935093407075033972099821'
38+
'15310256415249098018077865788815173701691026788460916647'
39+
'38064458963316171186642466965495956524082894463374763543'
40+
'61838599762500808052368249716736')
41+
int_max = int(float_info.max)
42+
self.assertEqual(nformat(int_max, '.'), most_max.format('', '8'))
43+
self.assertEqual(nformat(int_max + 1, '.'), most_max.format('', '9'))
44+
self.assertEqual(nformat(int_max * 2, '.'), most_max2.format(''))
45+
self.assertEqual(nformat(0 - int_max, '.'), most_max.format('-', '8'))
46+
self.assertEqual(nformat(-1 - int_max, '.'), most_max.format('-', '9'))
47+
self.assertEqual(nformat(-2 * int_max, '.'), most_max2.format('-'))

tests/regressiontests/utils/tests.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from .ipv6 import TestUtilsIPv6
2222
from .jslex import JsToCForGettextTest, JsTokensTest
2323
from .module_loading import CustomLoader, DefaultLoader, EggLoader
24+
from .numberformat import TestNumberFormat
2425
from .os_utils import SafeJoinTests
2526
from .regex_helper import NormalizeTests
2627
from .simplelazyobject import TestUtilsSimpleLazyObject

0 commit comments

Comments
 (0)