diff --git a/src/json.hpp b/src/json.hpp index 03df742648..08b95cdbdd 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8298,25 +8298,7 @@ class basic_json snprintf(m_buf.data(), m_buf.size(), fmt, x); -#if 0 - // C locales and C++ locales are similar but - // different. - // - // If working with C++ streams we'd've used - // these, but for C formatting functions we - // have to use C locales (setlocale / localeconv), - // rather than C++ locales (std::locale installed - // by std::locale::global()). - const std::locale loc; - - const char thousands_sep = - std::use_facet< std::numpunct>( - loc).thousands_sep(); - - const char decimal_point = - std::use_facet< std::numpunct>( - loc).decimal_point(); -#else + // read information from locale const auto loc = localeconv(); assert(loc != nullptr); const char thousands_sep = !loc->thousands_sep ? '\0' @@ -8324,7 +8306,6 @@ class basic_json const char decimal_point = !loc->decimal_point ? '\0' : loc->decimal_point[0]; -#endif // erase thousands separator if (thousands_sep != '\0') diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index bf7f380ab9..050b0b6b53 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8298,25 +8298,7 @@ class basic_json snprintf(m_buf.data(), m_buf.size(), fmt, x); -#if 0 - // C locales and C++ locales are similar but - // different. - // - // If working with C++ streams we'd've used - // these, but for C formatting functions we - // have to use C locales (setlocale / localeconv), - // rather than C++ locales (std::locale installed - // by std::locale::global()). - const std::locale loc; - - const char thousands_sep = - std::use_facet< std::numpunct>( - loc).thousands_sep(); - - const char decimal_point = - std::use_facet< std::numpunct>( - loc).decimal_point(); -#else + // read information from locale const auto loc = localeconv(); assert(loc != nullptr); const char thousands_sep = !loc->thousands_sep ? '\0' @@ -8324,7 +8306,6 @@ class basic_json const char decimal_point = !loc->decimal_point ? '\0' : loc->decimal_point[0]; -#endif // erase thousands separator if (thousands_sep != '\0') diff --git a/test/src/unit-regression.cpp b/test/src/unit-regression.cpp index f998fcb9b8..29ca82ecc4 100644 --- a/test/src/unit-regression.cpp +++ b/test/src/unit-regression.cpp @@ -361,8 +361,8 @@ TEST_CASE("regression tests") SECTION("issue #228 - double values are serialized with commas as decimal points") { - json j1a = 23.42; - json j1b = json::parse("23.42"); + json j1a = 2312.42; + json j1b = json::parse("2312.42"); json j2a = 2342e-2; //issue #230 @@ -380,23 +380,33 @@ TEST_CASE("regression tests") { return ','; } + + char do_thousands_sep() const + { + return '.'; + } + + std::string do_grouping() const + { + return "\03"; + } }; // change locale to mess with decimal points auto orig_locale = std::locale::global(std::locale(std::locale(), new CommaDecimalSeparator)); - CHECK(j1a.dump() == "23.42"); - CHECK(j1b.dump() == "23.42"); + CHECK(j1a.dump() == "2312.42"); + CHECK(j1b.dump() == "2312.42"); // check if locale is properly reset std::stringstream ss; ss.imbue(std::locale(std::locale(), new CommaDecimalSeparator)); - ss << 47.11; - CHECK(ss.str() == "47,11"); + ss << 4712.11; + CHECK(ss.str() == "4.712,11"); ss << j1a; - CHECK(ss.str() == "47,1123.42"); + CHECK(ss.str() == "4.712,112312.42"); ss << 47.11; - CHECK(ss.str() == "47,1123.4247,11"); + CHECK(ss.str() == "4.712,112312.4247,11"); CHECK(j2a.dump() == "23.42"); //issue #230