]> granicus.if.org Git - python/commitdiff
Issue #2482: Make sure that the coefficient of a Decimal instance
authorMark Dickinson <dickinsm@gmail.com>
Tue, 25 Mar 2008 18:58:13 +0000 (18:58 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Tue, 25 Mar 2008 18:58:13 +0000 (18:58 +0000)
is stored as a str instance rather than a unicode instance.
Backported from Python 2.6 (see r61904).

Lib/decimal.py
Lib/test/test_decimal.py
Misc/NEWS

index 8b3e2526eef9c97dcdfaa64d699cb07c2b6cba56..591f4dee3fef698e1d814baaf5dee1e9bec64032 100644 (file)
@@ -549,17 +549,17 @@ class Decimal(object):
                 fracpart = m.group('frac')
                 exp = int(m.group('exp') or '0')
                 if fracpart is not None:
-                    self._int = (intpart+fracpart).lstrip('0') or '0'
+                    self._int = str((intpart+fracpart).lstrip('0') or '0')
                     self._exp = exp - len(fracpart)
                 else:
-                    self._int = intpart.lstrip('0') or '0'
+                    self._int = str(intpart.lstrip('0') or '0')
                     self._exp = exp
                 self._is_special = False
             else:
                 diag = m.group('diag')
                 if diag is not None:
                     # NaN
-                    self._int = diag.lstrip('0')
+                    self._int = str(diag.lstrip('0'))
                     if m.group('signal'):
                         self._exp = 'N'
                     else:
index efaa174301a8ae39d0b680828bd342c9d18f72a4..db55b83fc3130872e81403eeb5b0c33e8700815e 100644 (file)
@@ -429,6 +429,12 @@ class DecimalExplicitConstructionTest(unittest.TestCase):
         #just not a number
         self.assertEqual(str(Decimal('ugly')), 'NaN')
 
+        #unicode strings should be permitted
+        self.assertEqual(str(Decimal(u'0E-017')), '0E-17')
+        self.assertEqual(str(Decimal(u'45')), '45')
+        self.assertEqual(str(Decimal(u'-Inf')), '-Infinity')
+        self.assertEqual(str(Decimal(u'NaN123')), 'NaN123')
+
     def test_explicit_from_tuples(self):
 
         #zero
@@ -1032,6 +1038,16 @@ class DecimalUsabilityTest(unittest.TestCase):
         self.assertEqual(str(d), '15.32')               # str
         self.assertEqual(repr(d), 'Decimal("15.32")')   # repr
 
+        # result type of string methods should be str, not unicode
+        unicode_inputs = [u'123.4', u'0.5E2', u'Infinity', u'sNaN',
+                          u'-0.0E100', u'-NaN001', u'-Inf']
+
+        for u in unicode_inputs:
+            d = Decimal(u)
+            self.assertEqual(type(str(d)), str)
+            self.assertEqual(type(repr(d)), str)
+            self.assertEqual(type(d.to_eng_string()), str)
+
     def test_tonum_methods(self):
         #Test float, int and long methods.
 
index 39b32cf0e70d8c30e06a670e3009dcf273ec57e6..0a182bd2f7d4a5edcc62477f65e21e310901a0b2 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -27,6 +27,11 @@ Core and builtins
 Library
 -------
 
+- Issue #2482: Make sure that the coefficient of a Decimal is always
+  stored as a str instance, not as a unicode instance.  This ensures
+  that str(Decimal) is always an instance of str.  This fixes a
+  regression from Python 2.5.1 to Python 2.5.2.
+
 - Issue #2478: fix failure of decimal.Decimal(0).sqrt()
 
 - Issue #2432: give DictReader the dialect and line_num attributes