summaryrefslogtreecommitdiffstats
path: root/Modules/_localemodule.c
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2018-01-15 22:23:47 (GMT)
committerGitHub <noreply@github.com>2018-01-15 22:23:47 (GMT)
commit5f959c4f9eca404b8bc4bc6348fed27c4b907b89 (patch)
tree29b215542b7705687eb5644a0640896e587646b7 /Modules/_localemodule.c
parentfb8569e36f2629654d5bc9c7ba05978edce408f4 (diff)
downloadcpython-5f959c4f9eca404b8bc4bc6348fed27c4b907b89.zip
cpython-5f959c4f9eca404b8bc4bc6348fed27c4b907b89.tar.gz
cpython-5f959c4f9eca404b8bc4bc6348fed27c4b907b89.tar.bz2
[3.6] bpo-31900: Fix localeconv() encoding for LC_NUMERIC (#4174) (#5192)
* Add _Py_GetLocaleconvNumeric() function: decode decimal_point and thousands_sep fields of localeconv() from the LC_NUMERIC encoding, rather than decoding from the LC_CTYPE encoding. * Modify locale.localeconv() and "n" formatter of str.format() (for int, float and complex to use _Py_GetLocaleconvNumeric() internally. (cherry picked from commit cb064fc2321ce8673fe365e9ef60445a27657f54)
Diffstat (limited to 'Modules/_localemodule.c')
-rw-r--r--Modules/_localemodule.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c
index 71c9146..95b370b 100644
--- a/Modules/_localemodule.c
+++ b/Modules/_localemodule.c
@@ -171,12 +171,6 @@ PyLocale_localeconv(PyObject* self)
RESULT(#i, x); \
} while (0)
- /* Numeric information */
- RESULT_STRING(decimal_point);
- RESULT_STRING(thousands_sep);
- x = copy_grouping(l->grouping);
- RESULT("grouping", x);
-
/* Monetary information */
RESULT_STRING(int_curr_symbol);
RESULT_STRING(currency_symbol);
@@ -195,6 +189,32 @@ PyLocale_localeconv(PyObject* self)
RESULT_INT(n_sep_by_space);
RESULT_INT(p_sign_posn);
RESULT_INT(n_sign_posn);
+
+ /* Numeric information */
+ PyObject *decimal_point, *thousands_sep;
+ const char *grouping;
+ if (_Py_GetLocaleconvNumeric(&decimal_point,
+ &thousands_sep,
+ &grouping) < 0) {
+ goto failed;
+ }
+
+ if (PyDict_SetItemString(result, "decimal_point", decimal_point) < 0) {
+ Py_DECREF(decimal_point);
+ Py_DECREF(thousands_sep);
+ goto failed;
+ }
+ Py_DECREF(decimal_point);
+
+ if (PyDict_SetItemString(result, "thousands_sep", thousands_sep) < 0) {
+ Py_DECREF(thousands_sep);
+ goto failed;
+ }
+ Py_DECREF(thousands_sep);
+
+ x = copy_grouping(grouping);
+ RESULT("grouping", x);
+
return result;
failed: