Replace occurrences of '\d' with '[0-9]' in Decimal regex, to make sure
authorMark Dickinson <dickinsm@gmail.com>
Wed, 2 Jul 2008 09:37:01 +0000 (09:37 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Wed, 2 Jul 2008 09:37:01 +0000 (09:37 +0000)
that the behaviour of Decimal doesn't change if/when re.UNICODE becomes
assumed in Python 3.0.

Also add a check that alternative Unicode digits (e.g. u'\N{FULLWIDTH
DIGIT ONE}') are *not* accepted in a numeric string.

Lib/decimal.py
Lib/test/test_decimal.py

index 940a9d24d44c007f1bdafd88495f31e596d5cd60..c94e1be051f856c2e978307200ecbaea0988f4b7 100644 (file)
@@ -5337,20 +5337,20 @@ ExtendedContext = Context(
 # other meaning for \d than the numbers [0-9].
 
 import re
-_parser = re.compile(r"""     # A numeric string consists of:
+_parser = re.compile(r"""        # A numeric string consists of:
 #    \s*
-    (?P<sign>[-+])?           # an optional sign, followed by either...
+    (?P<sign>[-+])?              # an optional sign, followed by either...
     (
-        (?=\d|\.\d)           # ...a number (with at least one digit)
-        (?P<int>\d*)          # consisting of a (possibly empty) integer part
-        (\.(?P<frac>\d*))?    # followed by an optional fractional part
-        (E(?P<exp>[-+]?\d+))? # followed by an optional exponent, or...
+        (?=[0-9]|\.[0-9])        # ...a number (with at least one digit)
+        (?P<int>[0-9]*)          # having a (possibly empty) integer part
+        (\.(?P<frac>[0-9]*))?    # followed by an optional fractional part
+        (E(?P<exp>[-+]?[0-9]+))? # followed by an optional exponent, or...
     |
-        Inf(inity)?           # ...an infinity, or...
+        Inf(inity)?              # ...an infinity, or...
     |
-        (?P<signal>s)?        # ...an (optionally signaling)
-        NaN                   # NaN
-        (?P<diag>\d*)         # with (possibly empty) diagnostic information.
+        (?P<signal>s)?           # ...an (optionally signaling)
+        NaN                      # NaN
+        (?P<diag>[0-9]*)         # with (possibly empty) diagnostic info.
     )
 #    \s*
     \Z
index 17c6373edf774abdc0932d90421c6ccbfca0847d..74304f70fe485538868a1c75dcb05305981c7cb9 100644 (file)
@@ -432,6 +432,9 @@ class DecimalExplicitConstructionTest(unittest.TestCase):
         self.assertEqual(str(Decimal(u'-Inf')), '-Infinity')
         self.assertEqual(str(Decimal(u'NaN123')), 'NaN123')
 
+        #but alternate unicode digits should not
+        self.assertEqual(str(Decimal(u'\uff11')), 'NaN')
+
     def test_explicit_from_tuples(self):
 
         #zero