annotate babel/tests/numbers.py @ 245:d462423feeea

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