From fcfff0a7fa6ece4c806b6e1a0a66b5ce214b9a28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Mon, 3 Jul 2006 12:19:50 +0000 Subject: Bug #1417699: Reject locale-specific decimal point in float() and atof(). --- Lib/test/test__locale.py | 3 +++ Lib/test/test_builtin.py | 17 ++++++++++++++--- Misc/NEWS | 3 +++ Python/pystrtod.c | 7 +++++++ 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Lib/test/test__locale.py b/Lib/test/test__locale.py index 9799f89..ec59d71 100644 --- a/Lib/test/test__locale.py +++ b/Lib/test/test__locale.py @@ -113,6 +113,9 @@ class _LocaleTests(unittest.TestCase): "using eval('3.14') failed for %s" % loc) self.assertEquals(int(float('3.14') * 100), 314, "using float('3.14') failed for %s" % loc) + if localeconv()['decimal_point'] != '.': + self.assertRaises(ValueError, float, + localeconv()['decimal_point'].join(['1', '23'])) def test_main(): run_unittest(_LocaleTests) diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index dcc565a..bcb4424 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -558,13 +558,24 @@ class BuiltinTest(unittest.TestCase): @run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE') def test_float_with_comma(self): # set locale to something that doesn't use '.' for the decimal point + # float must not accept the locale specific decimal point but + # it still has to accept the normal python syntac import locale if not locale.localeconv()['decimal_point'] == ',': return - self.assertEqual(float(" 3,14 "), 3.14) - self.assertEqual(float(" +3,14 "), 3.14) - self.assertEqual(float(" -3,14 "), -3.14) + self.assertEqual(float(" 3.14 "), 3.14) + self.assertEqual(float("+3.14 "), 3.14) + self.assertEqual(float("-3.14 "), -3.14) + self.assertEqual(float(".14 "), .14) + self.assertEqual(float("3. "), 3.0) + self.assertEqual(float("3.e3 "), 3000.0) + self.assertEqual(float("3.2e3 "), 3200.0) + self.assertEqual(float("2.5e-1 "), 0.25) + self.assertEqual(float("5e-1"), 0.5) + self.assertRaises(ValueError, float, " 3,14 ") + self.assertRaises(ValueError, float, " +3,14 ") + self.assertRaises(ValueError, float, " -3,14 ") self.assertRaises(ValueError, float, " 0x3.1 ") self.assertRaises(ValueError, float, " -0x3.p-1 ") self.assertEqual(float(" 25.e-1 "), 2.5) diff --git a/Misc/NEWS b/Misc/NEWS index a5faa9b..4740104 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.5 beta 2? Core and builtins ----------------- +- Bug #1417699: Reject locale-specific decimal point in float() + and atof(). + - Bug #1511381: codec_getstreamcodec() in codec.c is corrected to omit a default "error" argument for NULL pointer. This allows the parser to take a codec from cjkcodecs again. diff --git a/Python/pystrtod.c b/Python/pystrtod.c index e1c84ea..6c19b45 100644 --- a/Python/pystrtod.c +++ b/Python/pystrtod.c @@ -90,6 +90,13 @@ PyOS_ascii_strtod(const char *nptr, char **endptr) p++; end = p; } + else if (strncmp(p, decimal_point, decimal_point_len) == 0) + { + /* Python bug #1417699 */ + *endptr = (char*)nptr; + errno = EINVAL; + return val; + } /* For the other cases, we need not convert the decimal point */ } -- cgit v0.12