Skip to content

Commit

Permalink
✅ added test with thousands_sep
Browse files Browse the repository at this point in the history
  • Loading branch information
nlohmann committed Feb 19, 2017
1 parent 5b53f03 commit 4151f2d
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 48 deletions.
21 changes: 1 addition & 20 deletions src/json.hpp
Expand Up @@ -8298,33 +8298,14 @@ 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<char>>(
loc).thousands_sep();

const char decimal_point =
std::use_facet< std::numpunct<char>>(
loc).decimal_point();
#else
// read information from locale
const auto loc = localeconv();
assert(loc != nullptr);
const char thousands_sep = !loc->thousands_sep ? '\0'
: loc->thousands_sep[0];

const char decimal_point = !loc->decimal_point ? '\0'
: loc->decimal_point[0];
#endif

// erase thousands separator
if (thousands_sep != '\0')
Expand Down
21 changes: 1 addition & 20 deletions src/json.hpp.re2c
Expand Up @@ -8298,33 +8298,14 @@ 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<char>>(
loc).thousands_sep();

const char decimal_point =
std::use_facet< std::numpunct<char>>(
loc).decimal_point();
#else
// read information from locale
const auto loc = localeconv();
assert(loc != nullptr);
const char thousands_sep = !loc->thousands_sep ? '\0'
: loc->thousands_sep[0];

const char decimal_point = !loc->decimal_point ? '\0'
: loc->decimal_point[0];
#endif

// erase thousands separator
if (thousands_sep != '\0')
Expand Down
26 changes: 18 additions & 8 deletions test/src/unit-regression.cpp
Expand Up @@ -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
Expand All @@ -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
Expand Down

0 comments on commit 4151f2d

Please sign in to comment.