From 43dbe02d5b365e44b8be0fbf4dd5863787249c9e Mon Sep 17 00:00:00 2001 From: Niels Date: Mon, 21 Nov 2016 21:53:10 +0100 Subject: [PATCH 1/2] :bug: fixing #359 --- src/json.hpp | 25 ++----------------------- src/json.hpp.re2c | 25 ++----------------------- 2 files changed, 4 insertions(+), 46 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index a302bb02..b0313f71 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -122,26 +122,6 @@ struct has_mapped_type std::is_integral()))>::value; }; -/*! -@brief helper class to create locales with decimal point - -This struct is used a default locale during the JSON serialization. JSON -requires the decimal point to be `.`, so this function overloads the -`do_decimal_point()` function to return `.`. This function is called by -float-to-string conversions to retrieve the decimal separator between integer -and fractional parts. - -@sa https://github.com/nlohmann/json/issues/51#issuecomment-86869315 -@since version 2.0.0 -*/ -struct DecimalSeparator : std::numpunct -{ - char do_decimal_point() const - { - return '.'; - } -}; - } /*! @@ -2201,8 +2181,7 @@ class basic_json { std::stringstream ss; // fix locale problems - const static std::locale loc(std::locale(), new DecimalSeparator); - ss.imbue(loc); + ss.imbue(std::locale::classic()); // 6, 15 or 16 digits of precision allows round-trip IEEE 754 // string->float->string, string->double->string or string->long @@ -5829,7 +5808,7 @@ class basic_json o.width(0); // fix locale problems - const auto old_locale = o.imbue(std::locale(std::locale(), new DecimalSeparator)); + const auto old_locale = o.imbue(std::locale::classic()); // set precision // 6, 15 or 16 digits of precision allows round-trip IEEE 754 diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index b829889d..7c386cf6 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -122,26 +122,6 @@ struct has_mapped_type std::is_integral()))>::value; }; -/*! -@brief helper class to create locales with decimal point - -This struct is used a default locale during the JSON serialization. JSON -requires the decimal point to be `.`, so this function overloads the -`do_decimal_point()` function to return `.`. This function is called by -float-to-string conversions to retrieve the decimal separator between integer -and fractional parts. - -@sa https://github.com/nlohmann/json/issues/51#issuecomment-86869315 -@since version 2.0.0 -*/ -struct DecimalSeparator : std::numpunct -{ - char do_decimal_point() const - { - return '.'; - } -}; - } /*! @@ -2201,8 +2181,7 @@ class basic_json { std::stringstream ss; // fix locale problems - const static std::locale loc(std::locale(), new DecimalSeparator); - ss.imbue(loc); + ss.imbue(std::locale::classic()); // 6, 15 or 16 digits of precision allows round-trip IEEE 754 // string->float->string, string->double->string or string->long @@ -5829,7 +5808,7 @@ class basic_json o.width(0); // fix locale problems - const auto old_locale = o.imbue(std::locale(std::locale(), new DecimalSeparator)); + const auto old_locale = o.imbue(std::locale::classic()); // set precision // 6, 15 or 16 digits of precision allows round-trip IEEE 754 From abce5c25bbc58962ad7f2143029e2cd2850dcd41 Mon Sep 17 00:00:00 2001 From: Niels Date: Mon, 21 Nov 2016 23:38:17 +0100 Subject: [PATCH 2/2] :memo: cleaned comments and updated README --- README.md | 2 ++ src/json.hpp | 2 +- src/json.hpp.re2c | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 008c8304..5e899ac2 100644 --- a/README.md +++ b/README.md @@ -499,6 +499,8 @@ I deeply appreciate the help of the following people. - [ChristophJud](https://github.com/ChristophJud) overworked the CMake files to ease project inclusion. - [Vladimir Petrigo](https://github.com/vpetrigo) made a SFINAE hack more readable. - [Denis Andrejew](https://github.com/seeekr) fixed a grammar issue in the README file. +- [Pierre-Antoine Lacaze](https://github.com/palacaze) found a subtle bug in the `dump()` function. +- [TurpentineDistillery](https://github.com/TurpentineDistillery) pointed to [`std::locale::classic()`](http://en.cppreference.com/w/cpp/locale/locale/classic) to avoid too much locale joggling. Thanks a lot for helping out! diff --git a/src/json.hpp b/src/json.hpp index b0313f71..e71ffc4a 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -45,7 +45,7 @@ SOFTWARE. #include // istream, ostream #include // advance, begin, bidirectional_iterator_tag, distance, end, inserter, iterator, iterator_traits, next, random_access_iterator_tag, reverse_iterator #include // numeric_limits -#include // locale, numpunct +#include // locale #include // map #include // addressof, allocator, allocator_traits, unique_ptr #include // accumulate diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 7c386cf6..9eccc144 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -45,7 +45,7 @@ SOFTWARE. #include // istream, ostream #include // advance, begin, bidirectional_iterator_tag, distance, end, inserter, iterator, iterator_traits, next, random_access_iterator_tag, reverse_iterator #include // numeric_limits -#include // locale, numpunct +#include // locale #include // map #include // addressof, allocator, allocator_traits, unique_ptr #include // accumulate