Mercurial > babel > mirror
annotate babel/tests/numbers.py @ 576:e77dd06c40ef trunk
fix formatting of fraction in format_decimal() if the input value is a float with more than 7 significant digits (#183)
author | fschwarz |
---|---|
date | Sat, 28 Jul 2012 22:26:02 +0000 |
parents | 4e561e6411ba |
children | ea413a4d754b |
rev | line source |
---|---|
1 | 1 # -*- coding: utf-8 -*- |
2 # | |
530 | 3 # Copyright (C) 2007-2011 Edgewall Software |
1 | 4 # All rights reserved. |
5 # | |
6 # This software is licensed as described in the file COPYING, which | |
7 # you should have received as part of this distribution. The terms | |
8 # are also available at http://babel.edgewall.org/wiki/License. | |
9 # | |
10 # This software consists of voluntary contributions made by many | |
11 # individuals. For the exact contribution history, see the revision | |
12 # history and logs, available at http://babel.edgewall.org/log/. | |
13 | |
556 | 14 from decimal import Decimal |
1 | 15 import doctest |
16 import unittest | |
17 | |
18 from babel import numbers | |
19 | |
50 | 20 |
21 class FormatDecimalTestCase(unittest.TestCase): | |
22 | |
218 | 23 def test_patterns(self): |
24 self.assertEqual(numbers.format_decimal(12345, '##0', | |
25 locale='en_US'), '12345') | |
26 self.assertEqual(numbers.format_decimal(6.5, '0.00', locale='sv'), | |
27 '6,50') | |
28 self.assertEqual(numbers.format_decimal(10.0**20, | |
29 '#.00', locale='en_US'), | |
30 '100000000000000000000.00') | |
576
e77dd06c40ef
fix formatting of fraction in format_decimal() if the input value is a float with more than 7 significant digits (#183)
fschwarz
parents:
557
diff
changeset
|
31 # regression test for #183, fraction digits were not correctly cutted |
e77dd06c40ef
fix formatting of fraction in format_decimal() if the input value is a float with more than 7 significant digits (#183)
fschwarz
parents:
557
diff
changeset
|
32 # if the input was a float value and the value had more than 7 |
e77dd06c40ef
fix formatting of fraction in format_decimal() if the input value is a float with more than 7 significant digits (#183)
fschwarz
parents:
557
diff
changeset
|
33 # significant digits |
e77dd06c40ef
fix formatting of fraction in format_decimal() if the input value is a float with more than 7 significant digits (#183)
fschwarz
parents:
557
diff
changeset
|
34 self.assertEqual(u'12,345,678.05', |
e77dd06c40ef
fix formatting of fraction in format_decimal() if the input value is a float with more than 7 significant digits (#183)
fschwarz
parents:
557
diff
changeset
|
35 numbers.format_decimal(12345678.051, '#,##0.00', |
e77dd06c40ef
fix formatting of fraction in format_decimal() if the input value is a float with more than 7 significant digits (#183)
fschwarz
parents:
557
diff
changeset
|
36 locale='en_US')) |
218 | 37 |
50 | 38 def test_subpatterns(self): |
39 self.assertEqual(numbers.format_decimal(-12345, '#,##0.##;-#', | |
40 locale='en_US'), '-12,345') | |
41 self.assertEqual(numbers.format_decimal(-12345, '#,##0.##;(#)', | |
42 locale='en_US'), '(12,345)') | |
43 | |
44 def test_default_rounding(self): | |
62
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
50
diff
changeset
|
45 """ |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
50
diff
changeset
|
46 Testing Round-Half-Even (Banker's rounding) |
50 | 47 |
48 A '5' is rounded to the closest 'even' number | |
49 """ | |
50 self.assertEqual(numbers.format_decimal(5.5, '0', locale='sv'), '6') | |
51 self.assertEqual(numbers.format_decimal(6.5, '0', locale='sv'), '6') | |
218 | 52 self.assertEqual(numbers.format_decimal(6.5, '0', locale='sv'), '6') |
50 | 53 self.assertEqual(numbers.format_decimal(1.2325, locale='sv'), '1,232') |
54 self.assertEqual(numbers.format_decimal(1.2335, locale='sv'), '1,234') | |
55 | |
211
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
56 def test_significant_digits(self): |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
57 """Test significant digits patterns""" |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
58 self.assertEqual(numbers.format_decimal(123004, '@@',locale='en_US'), |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
59 '120000') |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
60 self.assertEqual(numbers.format_decimal(1.12, '@', locale='sv'), '1') |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
61 self.assertEqual(numbers.format_decimal(1.1, '@@', locale='sv'), '1,1') |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
62 self.assertEqual(numbers.format_decimal(1.1, '@@@@@##', locale='sv'), |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
63 '1,1000') |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
64 self.assertEqual(numbers.format_decimal(0.0001, '@@@', locale='sv'), |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
65 '0,000100') |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
66 self.assertEqual(numbers.format_decimal(0.0001234, '@@@', locale='sv'), |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
67 '0,000123') |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
68 self.assertEqual(numbers.format_decimal(0.0001234, '@@@#',locale='sv'), |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
69 '0,0001234') |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
70 self.assertEqual(numbers.format_decimal(0.0001234, '@@@#',locale='sv'), |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
71 '0,0001234') |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
72 self.assertEqual(numbers.format_decimal(0.12345, '@@@',locale='sv'), |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
73 '0,123') |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
74 self.assertEqual(numbers.format_decimal(3.14159, '@@##',locale='sv'), |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
75 '3,142') |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
76 self.assertEqual(numbers.format_decimal(1.23004, '@@##',locale='sv'), |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
77 '1,23') |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
78 self.assertEqual(numbers.format_decimal(1230.04, '@@,@@',locale='en_US'), |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
79 '12,30') |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
80 self.assertEqual(numbers.format_decimal(123.41, '@@##',locale='en_US'), |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
81 '123.4') |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
82 self.assertEqual(numbers.format_decimal(1, '@@',locale='en_US'), |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
83 '1.0') |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
84 self.assertEqual(numbers.format_decimal(0, '@',locale='en_US'), |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
85 '0') |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
86 self.assertEqual(numbers.format_decimal(0.1, '@',locale='en_US'), |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
87 '0.1') |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
88 self.assertEqual(numbers.format_decimal(0.1, '@#',locale='en_US'), |
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
89 '0.1') |
243
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
90 self.assertEqual(numbers.format_decimal(0.1, '@@', locale='en_US'), |
211
5125934e5f27
Added support for siginificant digits in number patterns.
jonas
parents:
62
diff
changeset
|
91 '0.10') |
218 | 92 |
556 | 93 def test_decimals(self): |
94 """Test significant digits patterns""" | |
95 self.assertEqual(numbers.format_decimal(Decimal('1.2345'), | |
96 '#.00', locale='en_US'), | |
97 '1.23') | |
98 self.assertEqual(numbers.format_decimal(Decimal('1.2345000'), | |
99 '#.00', locale='en_US'), | |
100 '1.23') | |
101 self.assertEqual(numbers.format_decimal(Decimal('1.2345000'), | |
102 '@@', locale='en_US'), | |
103 '1.2') | |
104 self.assertEqual(numbers.format_decimal(Decimal('12345678901234567890.12345'), | |
105 '#.00', locale='en_US'), | |
106 '12345678901234567890.12') | |
218 | 107 |
243
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
108 def test_scientific_notation(self): |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
109 fmt = numbers.format_scientific(0.1, '#E0', locale='en_US') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
110 self.assertEqual(fmt, '1E-1') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
111 fmt = numbers.format_scientific(0.01, '#E0', locale='en_US') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
112 self.assertEqual(fmt, '1E-2') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
113 fmt = numbers.format_scientific(10, '#E0', locale='en_US') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
114 self.assertEqual(fmt, '1E1') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
115 fmt = numbers.format_scientific(1234, '0.###E0', locale='en_US') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
116 self.assertEqual(fmt, '1.234E3') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
117 fmt = numbers.format_scientific(1234, '0.#E0', locale='en_US') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
118 self.assertEqual(fmt, '1.2E3') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
119 # Exponent grouping |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
120 fmt = numbers.format_scientific(12345, '##0.####E0', locale='en_US') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
121 self.assertEqual(fmt, '12.345E3') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
122 # Minimum number of int digits |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
123 fmt = numbers.format_scientific(12345, '00.###E0', locale='en_US') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
124 self.assertEqual(fmt, '12.345E3') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
125 fmt = numbers.format_scientific(-12345.6, '00.###E0', locale='en_US') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
126 self.assertEqual(fmt, '-12.346E3') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
127 fmt = numbers.format_scientific(-0.01234, '00.###E0', locale='en_US') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
128 self.assertEqual(fmt, '-12.34E-3') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
129 # Custom pattern suffic |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
130 fmt = numbers.format_scientific(123.45, '#.##E0 m/s', locale='en_US') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
131 self.assertEqual(fmt, '1.23E2 m/s') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
132 # Exponent patterns |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
133 fmt = numbers.format_scientific(123.45, '#.##E00 m/s', locale='en_US') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
134 self.assertEqual(fmt, '1.23E02 m/s') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
135 fmt = numbers.format_scientific(0.012345, '#.##E00 m/s', locale='en_US') |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
136 self.assertEqual(fmt, '1.23E-02 m/s') |
556 | 137 fmt = numbers.format_scientific(Decimal('12345'), '#.##E+00 m/s', |
138 locale='en_US') | |
139 self.assertEqual(fmt, '1.23E+04 m/s') | |
357 | 140 # 0 (see ticket #99) |
141 fmt = numbers.format_scientific(0, '#E0', locale='en_US') | |
142 self.assertEqual(fmt, '0E0') | |
243
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
143 |
1e5787ab265b
Added initial support for scientific notation patterns.
jonas
parents:
218
diff
changeset
|
144 |
557
4e561e6411ba
Only use bankers round algorithm as a tie breaker if there are two nearest numbers, round as usual if there is only one nearest number (#267, patch by Martin)
fschwarz
parents:
556
diff
changeset
|
145 class BankersRoundTestCase(unittest.TestCase): |
4e561e6411ba
Only use bankers round algorithm as a tie breaker if there are two nearest numbers, round as usual if there is only one nearest number (#267, patch by Martin)
fschwarz
parents:
556
diff
changeset
|
146 def test_round_to_nearest_integer(self): |
4e561e6411ba
Only use bankers round algorithm as a tie breaker if there are two nearest numbers, round as usual if there is only one nearest number (#267, patch by Martin)
fschwarz
parents:
556
diff
changeset
|
147 self.assertEqual(1, numbers.bankersround(Decimal('0.5001'))) |
4e561e6411ba
Only use bankers round algorithm as a tie breaker if there are two nearest numbers, round as usual if there is only one nearest number (#267, patch by Martin)
fschwarz
parents:
556
diff
changeset
|
148 |
4e561e6411ba
Only use bankers round algorithm as a tie breaker if there are two nearest numbers, round as usual if there is only one nearest number (#267, patch by Martin)
fschwarz
parents:
556
diff
changeset
|
149 def test_round_to_even_for_two_nearest_integers(self): |
4e561e6411ba
Only use bankers round algorithm as a tie breaker if there are two nearest numbers, round as usual if there is only one nearest number (#267, patch by Martin)
fschwarz
parents:
556
diff
changeset
|
150 self.assertEqual(0, numbers.bankersround(Decimal('0.5'))) |
4e561e6411ba
Only use bankers round algorithm as a tie breaker if there are two nearest numbers, round as usual if there is only one nearest number (#267, patch by Martin)
fschwarz
parents:
556
diff
changeset
|
151 self.assertEqual(2, numbers.bankersround(Decimal('1.5'))) |
4e561e6411ba
Only use bankers round algorithm as a tie breaker if there are two nearest numbers, round as usual if there is only one nearest number (#267, patch by Martin)
fschwarz
parents:
556
diff
changeset
|
152 self.assertEqual(-2, numbers.bankersround(Decimal('-2.5'))) |
4e561e6411ba
Only use bankers round algorithm as a tie breaker if there are two nearest numbers, round as usual if there is only one nearest number (#267, patch by Martin)
fschwarz
parents:
556
diff
changeset
|
153 |
4e561e6411ba
Only use bankers round algorithm as a tie breaker if there are two nearest numbers, round as usual if there is only one nearest number (#267, patch by Martin)
fschwarz
parents:
556
diff
changeset
|
154 self.assertEqual(0, numbers.bankersround(Decimal('0.05'), ndigits=1)) |
4e561e6411ba
Only use bankers round algorithm as a tie breaker if there are two nearest numbers, round as usual if there is only one nearest number (#267, patch by Martin)
fschwarz
parents:
556
diff
changeset
|
155 self.assertEqual(Decimal('0.2'), numbers.bankersround(Decimal('0.15'), ndigits=1)) |
4e561e6411ba
Only use bankers round algorithm as a tie breaker if there are two nearest numbers, round as usual if there is only one nearest number (#267, patch by Martin)
fschwarz
parents:
556
diff
changeset
|
156 |
4e561e6411ba
Only use bankers round algorithm as a tie breaker if there are two nearest numbers, round as usual if there is only one nearest number (#267, patch by Martin)
fschwarz
parents:
556
diff
changeset
|
157 |
1 | 158 def suite(): |
159 suite = unittest.TestSuite() | |
160 suite.addTest(doctest.DocTestSuite(numbers)) | |
50 | 161 suite.addTest(unittest.makeSuite(FormatDecimalTestCase)) |
557
4e561e6411ba
Only use bankers round algorithm as a tie breaker if there are two nearest numbers, round as usual if there is only one nearest number (#267, patch by Martin)
fschwarz
parents:
556
diff
changeset
|
162 suite.addTest(unittest.makeSuite(BankersRoundTestCase)) |
1 | 163 return suite |
164 | |
165 if __name__ == '__main__': | |
166 unittest.main(defaultTest='suite') |