Make the Rational constructor accept '3.' and '.2' as well as '3.2'.

This commit is contained in:
Mark Dickinson 2008-02-02 17:16:13 +00:00
parent 5a6cfee632
commit 1dabdb25f8
2 changed files with 18 additions and 3 deletions

View File

@ -25,9 +25,18 @@ def gcd(a, b):
return a return a
_RATIONAL_FORMAT = re.compile( _RATIONAL_FORMAT = re.compile(r"""
r'^\s*(?P<sign>[-+]?)(?P<num>\d+)' \A\s* # optional whitespace at the start, then
r'(?:/(?P<denom>\d+)|\.(?P<decimal>\d+))?\s*$') (?P<sign>[-+]?) # an optional sign, then
(?=\d|\.\d) # lookahead for digit or .digit
(?P<num>\d*) # numerator (possibly empty)
(?: # followed by an optional
/(?P<denom>\d+) # / and denominator
| # or
\.(?P<decimal>\d*) # decimal point and fractional part
)?
\s*\Z # and optional whitespace to finish
""", re.VERBOSE)
class Rational(RationalAbc): class Rational(RationalAbc):

View File

@ -78,6 +78,8 @@ class RationalTest(unittest.TestCase):
self.assertEquals((16, 5), _components(R(" 3.2 "))) self.assertEquals((16, 5), _components(R(" 3.2 ")))
self.assertEquals((-16, 5), _components(R(u" -3.2 "))) self.assertEquals((-16, 5), _components(R(u" -3.2 ")))
self.assertEquals((-3, 1), _components(R(u" -3. ")))
self.assertEquals((3, 5), _components(R(u" .6 ")))
self.assertRaisesMessage( self.assertRaisesMessage(
@ -113,6 +115,10 @@ class RationalTest(unittest.TestCase):
# Don't accept combinations of decimals and rationals. # Don't accept combinations of decimals and rationals.
ValueError, "Invalid literal for Rational: 3.2/7", ValueError, "Invalid literal for Rational: 3.2/7",
R, "3.2/7") R, "3.2/7")
self.assertRaisesMessage(
# Allow 3. and .3, but not .
ValueError, "Invalid literal for Rational: .",
R, ".")
def testImmutable(self): def testImmutable(self):
r = R(7, 3) r = R(7, 3)