mirror of
https://github.com/python/cpython.git
synced 2025-08-01 23:53:15 +00:00
Issue #6595: Allow Decimal constructor to accept non-European decimal
digits, as recommended by the specification. (Backport of r74279 from py3k.)
This commit is contained in:
parent
9279e7d177
commit
4326ad8f72
4 changed files with 29 additions and 20 deletions
|
@ -554,20 +554,16 @@ class Decimal(object):
|
|||
intpart = m.group('int')
|
||||
if intpart is not None:
|
||||
# finite number
|
||||
fracpart = m.group('frac')
|
||||
fracpart = m.group('frac') or ''
|
||||
exp = int(m.group('exp') or '0')
|
||||
if fracpart is not None:
|
||||
self._int = str((intpart+fracpart).lstrip('0') or '0')
|
||||
self._exp = exp - len(fracpart)
|
||||
else:
|
||||
self._int = str(intpart.lstrip('0') or '0')
|
||||
self._exp = exp
|
||||
self._int = str(int(intpart+fracpart))
|
||||
self._exp = exp - len(fracpart)
|
||||
self._is_special = False
|
||||
else:
|
||||
diag = m.group('diag')
|
||||
if diag is not None:
|
||||
# NaN
|
||||
self._int = str(diag.lstrip('0'))
|
||||
self._int = str(int(diag or '0')).lstrip('0')
|
||||
if m.group('signal'):
|
||||
self._exp = 'N'
|
||||
else:
|
||||
|
@ -5402,29 +5398,26 @@ ExtendedContext = Context(
|
|||
# number between the optional sign and the optional exponent must have
|
||||
# at least one decimal digit, possibly after the decimal point. The
|
||||
# lookahead expression '(?=\d|\.\d)' checks this.
|
||||
#
|
||||
# As the flag UNICODE is not enabled here, we're explicitly avoiding any
|
||||
# other meaning for \d than the numbers [0-9].
|
||||
|
||||
import re
|
||||
_parser = re.compile(r""" # A numeric string consists of:
|
||||
# \s*
|
||||
(?P<sign>[-+])? # an optional sign, followed by either...
|
||||
(
|
||||
(?=[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...
|
||||
(?=\d|\.\d) # ...a number (with at least one digit)
|
||||
(?P<int>\d*) # having a (possibly empty) integer part
|
||||
(\.(?P<frac>\d*))? # followed by an optional fractional part
|
||||
(E(?P<exp>[-+]?\d+))? # followed by an optional exponent, or...
|
||||
|
|
||||
Inf(inity)? # ...an infinity, or...
|
||||
|
|
||||
(?P<signal>s)? # ...an (optionally signaling)
|
||||
NaN # NaN
|
||||
(?P<diag>[0-9]*) # with (possibly empty) diagnostic info.
|
||||
(?P<diag>\d*) # with (possibly empty) diagnostic info.
|
||||
)
|
||||
# \s*
|
||||
\Z
|
||||
""", re.VERBOSE | re.IGNORECASE).match
|
||||
""", re.VERBOSE | re.IGNORECASE | re.UNICODE).match
|
||||
|
||||
_all_zeros = re.compile('0*$').match
|
||||
_exact_half = re.compile('50*$').match
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue