diff --git a/src/json.hpp b/src/json.hpp index 79df1f782..2f48639ff 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -49,6 +49,7 @@ Class @ref nlohmann::basic_json is a good entry point for the documentation. #include #include #include +#include #include #include #include @@ -6932,18 +6933,18 @@ basic_json_parser_59: read past the current token. The latter case needs to be treated by the caller function. + @note This function is locale-independent, see + http://stackoverflow.com/a/1333899/266378 + @throw std::range_error if passed value is out of range */ long double get_number() const { - // conversion - typename string_t::value_type* endptr; - const auto float_val = std::strtold(reinterpret_cast(m_start), - &endptr); - - // return float_val if the whole number was translated and NAN - // otherwise - return (reinterpret_cast(endptr) == m_cursor) ? float_val : NAN; + long double f = NAN; + std::stringstream ss(get_token()); + ss.imbue(std::locale("C")); + ss >> f; + return f; } private: diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 585aa2056..708124e33 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -49,6 +49,7 @@ Class @ref nlohmann::basic_json is a good entry point for the documentation. #include #include #include +#include #include #include #include @@ -6238,18 +6239,18 @@ class basic_json read past the current token. The latter case needs to be treated by the caller function. + @note This function is locale-independent, see + http://stackoverflow.com/a/1333899/266378 + @throw std::range_error if passed value is out of range */ long double get_number() const { - // conversion - typename string_t::value_type* endptr; - const auto float_val = std::strtold(reinterpret_cast(m_start), - &endptr); - - // return float_val if the whole number was translated and NAN - // otherwise - return (reinterpret_cast(endptr) == m_cursor) ? float_val : NAN; + long double f = NAN; + std::stringstream ss(get_token()); + ss.imbue(std::locale("C")); + ss >> f; + return f; } private: