diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2018-01-15 22:23:47 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-15 22:23:47 (GMT) |
commit | 5f959c4f9eca404b8bc4bc6348fed27c4b907b89 (patch) | |
tree | 29b215542b7705687eb5644a0640896e587646b7 /Modules/_localemodule.c | |
parent | fb8569e36f2629654d5bc9c7ba05978edce408f4 (diff) | |
download | cpython-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.c | 32 |
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: |