diff --git a/src/json.hpp b/src/json.hpp index 2f48639f..79df1f78 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -49,7 +49,6 @@ Class @ref nlohmann::basic_json is a good entry point for the documentation. #include #include #include -#include #include #include #include @@ -6933,18 +6932,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 { - long double f = NAN; - std::stringstream ss(get_token()); - ss.imbue(std::locale("C")); - ss >> f; - return f; + // 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; } private: diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 708124e3..585aa205 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -49,7 +49,6 @@ Class @ref nlohmann::basic_json is a good entry point for the documentation. #include #include #include -#include #include #include #include @@ -6239,18 +6238,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 { - long double f = NAN; - std::stringstream ss(get_token()); - ss.imbue(std::locale("C")); - ss >> f; - return f; + // 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; } private: