]> granicus.if.org Git - python/commitdiff
Issue #13918: Provide a locale.delocalize() function which can remove
authorAntoine Pitrou <solipsis@pitrou.net>
Thu, 23 Oct 2014 20:52:31 +0000 (22:52 +0200)
committerAntoine Pitrou <solipsis@pitrou.net>
Thu, 23 Oct 2014 20:52:31 +0000 (22:52 +0200)
locale-specific number formatting from a string representing a number,
without then converting it to a specific type.  Patch by Cédric Krier.

Doc/library/locale.rst
Lib/locale.py
Lib/test/test_locale.py
Misc/NEWS

index 9600193547e1e23059b6b00f9abffcbcd4003748..c3a530c3e53dcd878d9a1bc1a9ddad5a3ac122e3 100644 (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`
index 7ff43561add23b24d18615a44b2c6e0325bc3b22..6b9eb3a09bc73f89dc5660976c495c87c3b2cdcd 100644 (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 atof(string, func=float):
+    "Parses a string as a float according to the locale settings."
+    return func(delocalize(string))
 
-def atoi(str):
+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, "")
index e9797538798e066b94814d5f06b82272f65ca8d7..81fe57d0cb99d82ce79f33beb0df4beacbc138cf 100644 (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()
index 5e2dbac4f125532caaa24c48fc70cf0bc241575a..0fbe673b41907dc47a7ed76fdae2c1b693e174e6 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.