annotate babel/tests/numbers.py @ 530:85e1beadacb0

Update the copyright line.
author jruigrok
date Sat, 05 Mar 2011 15:22:28 +0000
parents 68e45b6ac5bb
children
rev   line source
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
2 #
530
85e1beadacb0 Update the copyright line.
jruigrok
parents: 357
diff changeset
3 # Copyright (C) 2007-2011 Edgewall Software
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
4 # All rights reserved.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
5 #
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
6 # This software is licensed as described in the file COPYING, which
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
7 # you should have received as part of this distribution. The terms
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
8 # are also available at http://babel.edgewall.org/wiki/License.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
9 #
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
10 # This software consists of voluntary contributions made by many
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
11 # individuals. For the exact contribution history, see the revision
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
12 # history and logs, available at http://babel.edgewall.org/log/.
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
13
218
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
14 try:
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
15 from decimal import Decimal
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
16 have_decimal = True
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
17 except ImportError:
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
18 have_decimal = False
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
19
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
20 import doctest
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
21 import unittest
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
22
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
23 from babel import numbers
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
24
50
fa8a27b80eb4 Added round-half-even (banker's rounding) support.
jonas
parents: 12
diff changeset
25
fa8a27b80eb4 Added round-half-even (banker's rounding) support.
jonas
parents: 12
diff changeset
26 class FormatDecimalTestCase(unittest.TestCase):
fa8a27b80eb4 Added round-half-even (banker's rounding) support.
jonas
parents: 12
diff changeset
27
218
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
28 def test_patterns(self):
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
29 self.assertEqual(numbers.format_decimal(12345, '##0',
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
30 locale='en_US'), '12345')
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
31 self.assertEqual(numbers.format_decimal(6.5, '0.00', locale='sv'),
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
32 '6,50')
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
33 self.assertEqual(numbers.format_decimal(10.0**20,
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
34 '#.00', locale='en_US'),
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
35 '100000000000000000000.00')
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
36
50
fa8a27b80eb4 Added round-half-even (banker's rounding) support.
jonas
parents: 12
diff changeset
37 def test_subpatterns(self):
fa8a27b80eb4 Added round-half-even (banker's rounding) support.
jonas
parents: 12
diff changeset
38 self.assertEqual(numbers.format_decimal(-12345, '#,##0.##;-#',
fa8a27b80eb4 Added round-half-even (banker's rounding) support.
jonas
parents: 12
diff changeset
39 locale='en_US'), '-12,345')
fa8a27b80eb4 Added round-half-even (banker's rounding) support.
jonas
parents: 12
diff changeset
40 self.assertEqual(numbers.format_decimal(-12345, '#,##0.##;(#)',
fa8a27b80eb4 Added round-half-even (banker's rounding) support.
jonas
parents: 12
diff changeset
41 locale='en_US'), '(12,345)')
fa8a27b80eb4 Added round-half-even (banker's rounding) support.
jonas
parents: 12
diff changeset
42
fa8a27b80eb4 Added round-half-even (banker's rounding) support.
jonas
parents: 12
diff changeset
43 def test_default_rounding(self):
62
84d400066b71 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 50
diff changeset
44 """
84d400066b71 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 50
diff changeset
45 Testing Round-Half-Even (Banker's rounding)
50
fa8a27b80eb4 Added round-half-even (banker's rounding) support.
jonas
parents: 12
diff changeset
46
fa8a27b80eb4 Added round-half-even (banker's rounding) support.
jonas
parents: 12
diff changeset
47 A '5' is rounded to the closest 'even' number
fa8a27b80eb4 Added round-half-even (banker's rounding) support.
jonas
parents: 12
diff changeset
48 """
fa8a27b80eb4 Added round-half-even (banker's rounding) support.
jonas
parents: 12
diff changeset
49 self.assertEqual(numbers.format_decimal(5.5, '0', locale='sv'), '6')
fa8a27b80eb4 Added round-half-even (banker's rounding) support.
jonas
parents: 12
diff changeset
50 self.assertEqual(numbers.format_decimal(6.5, '0', locale='sv'), '6')
218
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
51 self.assertEqual(numbers.format_decimal(6.5, '0', locale='sv'), '6')
50
fa8a27b80eb4 Added round-half-even (banker's rounding) support.
jonas
parents: 12
diff changeset
52 self.assertEqual(numbers.format_decimal(1.2325, locale='sv'), '1,232')
fa8a27b80eb4 Added round-half-even (banker's rounding) support.
jonas
parents: 12
diff changeset
53 self.assertEqual(numbers.format_decimal(1.2335, locale='sv'), '1,234')
fa8a27b80eb4 Added round-half-even (banker's rounding) support.
jonas
parents: 12
diff changeset
54
211
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
55 def test_significant_digits(self):
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
56 """Test significant digits patterns"""
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
57 self.assertEqual(numbers.format_decimal(123004, '@@',locale='en_US'),
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
58 '120000')
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
59 self.assertEqual(numbers.format_decimal(1.12, '@', locale='sv'), '1')
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
60 self.assertEqual(numbers.format_decimal(1.1, '@@', locale='sv'), '1,1')
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
61 self.assertEqual(numbers.format_decimal(1.1, '@@@@@##', locale='sv'),
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
62 '1,1000')
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
63 self.assertEqual(numbers.format_decimal(0.0001, '@@@', locale='sv'),
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
64 '0,000100')
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
65 self.assertEqual(numbers.format_decimal(0.0001234, '@@@', locale='sv'),
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
66 '0,000123')
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
67 self.assertEqual(numbers.format_decimal(0.0001234, '@@@#',locale='sv'),
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
68 '0,0001234')
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
69 self.assertEqual(numbers.format_decimal(0.0001234, '@@@#',locale='sv'),
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
70 '0,0001234')
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
71 self.assertEqual(numbers.format_decimal(0.12345, '@@@',locale='sv'),
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
72 '0,123')
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
73 self.assertEqual(numbers.format_decimal(3.14159, '@@##',locale='sv'),
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
74 '3,142')
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
75 self.assertEqual(numbers.format_decimal(1.23004, '@@##',locale='sv'),
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
76 '1,23')
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
77 self.assertEqual(numbers.format_decimal(1230.04, '@@,@@',locale='en_US'),
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
78 '12,30')
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
79 self.assertEqual(numbers.format_decimal(123.41, '@@##',locale='en_US'),
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
80 '123.4')
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
81 self.assertEqual(numbers.format_decimal(1, '@@',locale='en_US'),
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
82 '1.0')
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
83 self.assertEqual(numbers.format_decimal(0, '@',locale='en_US'),
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
84 '0')
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
85 self.assertEqual(numbers.format_decimal(0.1, '@',locale='en_US'),
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
86 '0.1')
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
87 self.assertEqual(numbers.format_decimal(0.1, '@#',locale='en_US'),
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
88 '0.1')
243
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
89 self.assertEqual(numbers.format_decimal(0.1, '@@', locale='en_US'),
211
1adcbeb4607b Added support for siginificant digits in number patterns.
jonas
parents: 62
diff changeset
90 '0.10')
218
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
91
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
92 if have_decimal:
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
93 def test_decimals(self):
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
94 """Test significant digits patterns"""
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
95 self.assertEqual(numbers.format_decimal(Decimal('1.2345'),
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
96 '#.00', locale='en_US'),
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
97 '1.23')
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
98 self.assertEqual(numbers.format_decimal(Decimal('1.2345000'),
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
99 '#.00', locale='en_US'),
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
100 '1.23')
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
101 self.assertEqual(numbers.format_decimal(Decimal('1.2345000'),
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
102 '@@', locale='en_US'),
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
103 '1.2')
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
104 self.assertEqual(numbers.format_decimal(Decimal('12345678901234567890.12345'),
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
105 '#.00', locale='en_US'),
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
106 '12345678901234567890.12')
b566f483b763 Added Decimal support to the number formatter.
jonas
parents: 211
diff changeset
107
243
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
108 def test_scientific_notation(self):
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
109 fmt = numbers.format_scientific(0.1, '#E0', locale='en_US')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
110 self.assertEqual(fmt, '1E-1')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
111 fmt = numbers.format_scientific(0.01, '#E0', locale='en_US')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
112 self.assertEqual(fmt, '1E-2')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
113 fmt = numbers.format_scientific(10, '#E0', locale='en_US')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
114 self.assertEqual(fmt, '1E1')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
115 fmt = numbers.format_scientific(1234, '0.###E0', locale='en_US')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
116 self.assertEqual(fmt, '1.234E3')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
117 fmt = numbers.format_scientific(1234, '0.#E0', locale='en_US')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
118 self.assertEqual(fmt, '1.2E3')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
119 # Exponent grouping
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
120 fmt = numbers.format_scientific(12345, '##0.####E0', locale='en_US')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
121 self.assertEqual(fmt, '12.345E3')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
122 # Minimum number of int digits
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
123 fmt = numbers.format_scientific(12345, '00.###E0', locale='en_US')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
124 self.assertEqual(fmt, '12.345E3')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
125 fmt = numbers.format_scientific(-12345.6, '00.###E0', locale='en_US')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
126 self.assertEqual(fmt, '-12.346E3')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
127 fmt = numbers.format_scientific(-0.01234, '00.###E0', locale='en_US')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
128 self.assertEqual(fmt, '-12.34E-3')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
129 # Custom pattern suffic
5e4b1fd6b348 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')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
131 self.assertEqual(fmt, '1.23E2 m/s')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
132 # Exponent patterns
5e4b1fd6b348 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')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
134 self.assertEqual(fmt, '1.23E02 m/s')
5e4b1fd6b348 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')
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
136 self.assertEqual(fmt, '1.23E-02 m/s')
244
222ccdeef393 Added `Decimal` support to the scientific notation formatter and some code cleanup. This closes #52.
jonas
parents: 243
diff changeset
137 if have_decimal:
222ccdeef393 Added `Decimal` support to the scientific notation formatter and some code cleanup. This closes #52.
jonas
parents: 243
diff changeset
138 fmt = numbers.format_scientific(Decimal('12345'), '#.##E+00 m/s',
222ccdeef393 Added `Decimal` support to the scientific notation formatter and some code cleanup. This closes #52.
jonas
parents: 243
diff changeset
139 locale='en_US')
222ccdeef393 Added `Decimal` support to the scientific notation formatter and some code cleanup. This closes #52.
jonas
parents: 243
diff changeset
140 self.assertEqual(fmt, '1.23E+04 m/s')
357
68e45b6ac5bb Fix scientific notation for 0. closes #99
aronacher
parents: 244
diff changeset
141 # 0 (see ticket #99)
68e45b6ac5bb Fix scientific notation for 0. closes #99
aronacher
parents: 244
diff changeset
142 fmt = numbers.format_scientific(0, '#E0', locale='en_US')
68e45b6ac5bb Fix scientific notation for 0. closes #99
aronacher
parents: 244
diff changeset
143 self.assertEqual(fmt, '0E0')
243
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
144
5e4b1fd6b348 Added initial support for scientific notation patterns.
jonas
parents: 218
diff changeset
145
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
146 def suite():
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
147 suite = unittest.TestSuite()
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
148 suite.addTest(doctest.DocTestSuite(numbers))
50
fa8a27b80eb4 Added round-half-even (banker's rounding) support.
jonas
parents: 12
diff changeset
149 suite.addTest(unittest.makeSuite(FormatDecimalTestCase))
1
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
150 return suite
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
151
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
152 if __name__ == '__main__':
f71ca60f2a4a Import of initial code base.
cmlenz
parents:
diff changeset
153 unittest.main(defaultTest='suite')
Copyright (C) 2012-2017 Edgewall Software