mirror of https://github.com/python/cpython
Bug #1417699: Reject locale-specific decimal point in float()
and atof().
This commit is contained in:
parent
82c276ea33
commit
fcfff0a7fa
|
@ -113,6 +113,9 @@ class _LocaleTests(unittest.TestCase):
|
||||||
"using eval('3.14') failed for %s" % loc)
|
"using eval('3.14') failed for %s" % loc)
|
||||||
self.assertEquals(int(float('3.14') * 100), 314,
|
self.assertEquals(int(float('3.14') * 100), 314,
|
||||||
"using float('3.14') failed for %s" % loc)
|
"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():
|
def test_main():
|
||||||
run_unittest(_LocaleTests)
|
run_unittest(_LocaleTests)
|
||||||
|
|
|
@ -558,13 +558,24 @@ class BuiltinTest(unittest.TestCase):
|
||||||
@run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
|
@run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
|
||||||
def test_float_with_comma(self):
|
def test_float_with_comma(self):
|
||||||
# set locale to something that doesn't use '.' for the decimal point
|
# 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
|
import locale
|
||||||
if not locale.localeconv()['decimal_point'] == ',':
|
if not locale.localeconv()['decimal_point'] == ',':
|
||||||
return
|
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.1 ")
|
||||||
self.assertRaises(ValueError, float, " -0x3.p-1 ")
|
self.assertRaises(ValueError, float, " -0x3.p-1 ")
|
||||||
self.assertEqual(float(" 25.e-1 "), 2.5)
|
self.assertEqual(float(" 25.e-1 "), 2.5)
|
||||||
|
|
|
@ -12,6 +12,9 @@ What's New in Python 2.5 beta 2?
|
||||||
Core and builtins
|
Core and builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Bug #1417699: Reject locale-specific decimal point in float()
|
||||||
|
and atof().
|
||||||
|
|
||||||
- Bug #1511381: codec_getstreamcodec() in codec.c is corrected to
|
- Bug #1511381: codec_getstreamcodec() in codec.c is corrected to
|
||||||
omit a default "error" argument for NULL pointer. This allows
|
omit a default "error" argument for NULL pointer. This allows
|
||||||
the parser to take a codec from cjkcodecs again.
|
the parser to take a codec from cjkcodecs again.
|
||||||
|
|
|
@ -90,6 +90,13 @@ PyOS_ascii_strtod(const char *nptr, char **endptr)
|
||||||
p++;
|
p++;
|
||||||
end = 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 */
|
/* For the other cases, we need not convert the decimal point */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue