Issue #13918: Provide a locale.delocalize() function which can remove

locale-specific number formatting from a string representing a number,
without then converting it to a specific type.  Patch by Cédric Krier.
This commit is contained in:
Antoine Pitrou 2014-10-23 22:52:31 +02:00
parent fce60eaf15
commit b64bca9852
4 changed files with 75 additions and 6 deletions

View File

@ -387,6 +387,14 @@ The :mod:`locale` module defines the following exception and functions:
``str(float)``, but takes the decimal point into account.
.. function:: delocalize(string)
Converts a string into a normalized number string, following the
:const:'LC_NUMERIC`settings.
.. versionadded:: 3.5
.. function:: atof(string)
Converts a string to a floating point number, following the :const:`LC_NUMERIC`

View File

@ -301,8 +301,8 @@ def str(val):
"""Convert float to integer, taking the locale into account."""
return format("%.12g", val)
def atof(string, func=float):
"Parses a string as a float according to the locale settings."
def delocalize(string):
"Parses a string as a normalized number according to the locale settings."
#First, get rid of the grouping
ts = localeconv()['thousands_sep']
if ts:
@ -311,12 +311,15 @@ def atof(string, func=float):
dd = localeconv()['decimal_point']
if dd:
string = string.replace(dd, '.')
#finally, parse the string
return func(string)
return string
def atoi(str):
def atof(string, func=float):
"Parses a string as a float according to the locale settings."
return func(delocalize(string))
def atoi(string):
"Converts a string to an integer according to the locale settings."
return atof(str, int)
return int(delocalize(string))
def _test():
setlocale(LC_ALL, "")

View File

@ -524,5 +524,59 @@ class TestMiscellaneous(unittest.TestCase):
locale.setlocale(locale.LC_ALL, (b'not', b'valid'))
class BaseDelocalizeTest(BaseLocalizedTest):
def _test_delocalize(self, value, out):
self.assertEqual(locale.delocalize(value), out)
def _test_atof(self, value, out):
self.assertEqual(locale.atof(value), out)
def _test_atoi(self, value, out):
self.assertEqual(locale.atoi(value), out)
class TestEnUSDelocalize(EnUSCookedTest, BaseDelocalizeTest):
def test_delocalize(self):
self._test_delocalize('50000.00', '50000.00')
self._test_delocalize('50,000.00', '50000.00')
def test_atof(self):
self._test_atof('50000.00', 50000.)
self._test_atof('50,000.00', 50000.)
def test_atoi(self):
self._test_atoi('50000', 50000)
self._test_atoi('50,000', 50000)
class TestCDelocalizeTest(CCookedTest, BaseDelocalizeTest):
def test_delocalize(self):
self._test_delocalize('50000.00', '50000.00')
def test_atof(self):
self._test_atof('50000.00', 50000.)
def test_atoi(self):
self._test_atoi('50000', 50000)
class TestfrFRDelocalizeTest(FrFRCookedTest, BaseDelocalizeTest):
def test_delocalize(self):
self._test_delocalize('50000,00', '50000.00')
self._test_delocalize('50 000,00', '50000.00')
def test_atof(self):
self._test_atof('50000,00', 50000.)
self._test_atof('50 000,00', 50000.)
def test_atoi(self):
self._test_atoi('50000', 50000)
self._test_atoi('50 000', 50000)
if __name__ == '__main__':
unittest.main()

View File

@ -181,6 +181,10 @@ Core and Builtins
Library
-------
- Issue #13918: Provide a locale.delocalize() function which can remove
locale-specific number formatting from a string representing a number,
without then converting it to a specific type. Patch by Cédric Krier.
- Issue #22676: Make the pickling of global objects which don't have a
__module__ attribute less slow.