✅ added test with thousands_sep
This commit is contained in:
parent
5b53f03e7c
commit
4151f2d297
3 changed files with 20 additions and 48 deletions
21
src/json.hpp
21
src/json.hpp
|
@ -8298,25 +8298,7 @@ class basic_json
|
||||||
|
|
||||||
snprintf(m_buf.data(), m_buf.size(), fmt, x);
|
snprintf(m_buf.data(), m_buf.size(), fmt, x);
|
||||||
|
|
||||||
#if 0
|
// read information from locale
|
||||||
// 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
|
|
||||||
const auto loc = localeconv();
|
const auto loc = localeconv();
|
||||||
assert(loc != nullptr);
|
assert(loc != nullptr);
|
||||||
const char thousands_sep = !loc->thousands_sep ? '\0'
|
const char thousands_sep = !loc->thousands_sep ? '\0'
|
||||||
|
@ -8324,7 +8306,6 @@ class basic_json
|
||||||
|
|
||||||
const char decimal_point = !loc->decimal_point ? '\0'
|
const char decimal_point = !loc->decimal_point ? '\0'
|
||||||
: loc->decimal_point[0];
|
: loc->decimal_point[0];
|
||||||
#endif
|
|
||||||
|
|
||||||
// erase thousands separator
|
// erase thousands separator
|
||||||
if (thousands_sep != '\0')
|
if (thousands_sep != '\0')
|
||||||
|
|
|
@ -8298,25 +8298,7 @@ class basic_json
|
||||||
|
|
||||||
snprintf(m_buf.data(), m_buf.size(), fmt, x);
|
snprintf(m_buf.data(), m_buf.size(), fmt, x);
|
||||||
|
|
||||||
#if 0
|
// read information from locale
|
||||||
// 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
|
|
||||||
const auto loc = localeconv();
|
const auto loc = localeconv();
|
||||||
assert(loc != nullptr);
|
assert(loc != nullptr);
|
||||||
const char thousands_sep = !loc->thousands_sep ? '\0'
|
const char thousands_sep = !loc->thousands_sep ? '\0'
|
||||||
|
@ -8324,7 +8306,6 @@ class basic_json
|
||||||
|
|
||||||
const char decimal_point = !loc->decimal_point ? '\0'
|
const char decimal_point = !loc->decimal_point ? '\0'
|
||||||
: loc->decimal_point[0];
|
: loc->decimal_point[0];
|
||||||
#endif
|
|
||||||
|
|
||||||
// erase thousands separator
|
// erase thousands separator
|
||||||
if (thousands_sep != '\0')
|
if (thousands_sep != '\0')
|
||||||
|
|
|
@ -361,8 +361,8 @@ TEST_CASE("regression tests")
|
||||||
|
|
||||||
SECTION("issue #228 - double values are serialized with commas as decimal points")
|
SECTION("issue #228 - double values are serialized with commas as decimal points")
|
||||||
{
|
{
|
||||||
json j1a = 23.42;
|
json j1a = 2312.42;
|
||||||
json j1b = json::parse("23.42");
|
json j1b = json::parse("2312.42");
|
||||||
|
|
||||||
json j2a = 2342e-2;
|
json j2a = 2342e-2;
|
||||||
//issue #230
|
//issue #230
|
||||||
|
@ -380,23 +380,33 @@ TEST_CASE("regression tests")
|
||||||
{
|
{
|
||||||
return ',';
|
return ',';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char do_thousands_sep() const
|
||||||
|
{
|
||||||
|
return '.';
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string do_grouping() const
|
||||||
|
{
|
||||||
|
return "\03";
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// change locale to mess with decimal points
|
// change locale to mess with decimal points
|
||||||
auto orig_locale = std::locale::global(std::locale(std::locale(), new CommaDecimalSeparator));
|
auto orig_locale = std::locale::global(std::locale(std::locale(), new CommaDecimalSeparator));
|
||||||
|
|
||||||
CHECK(j1a.dump() == "23.42");
|
CHECK(j1a.dump() == "2312.42");
|
||||||
CHECK(j1b.dump() == "23.42");
|
CHECK(j1b.dump() == "2312.42");
|
||||||
|
|
||||||
// check if locale is properly reset
|
// check if locale is properly reset
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss.imbue(std::locale(std::locale(), new CommaDecimalSeparator));
|
ss.imbue(std::locale(std::locale(), new CommaDecimalSeparator));
|
||||||
ss << 47.11;
|
ss << 4712.11;
|
||||||
CHECK(ss.str() == "47,11");
|
CHECK(ss.str() == "4.712,11");
|
||||||
ss << j1a;
|
ss << j1a;
|
||||||
CHECK(ss.str() == "47,1123.42");
|
CHECK(ss.str() == "4.712,112312.42");
|
||||||
ss << 47.11;
|
ss << 47.11;
|
||||||
CHECK(ss.str() == "47,1123.4247,11");
|
CHECK(ss.str() == "4.712,112312.4247,11");
|
||||||
|
|
||||||
CHECK(j2a.dump() == "23.42");
|
CHECK(j2a.dump() == "23.42");
|
||||||
//issue #230
|
//issue #230
|
||||||
|
|
Loading…
Reference in a new issue