diff --git a/src/to_chars.cpp b/src/to_chars.cpp index 2e1f880..682a83f 100644 --- a/src/to_chars.cpp +++ b/src/to_chars.cpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace boost { namespace charconv { namespace detail { @@ -292,8 +293,21 @@ boost::charconv::to_chars_result boost::charconv::to_chars(char* first, char* la if (fmt == boost::charconv::chars_format::general) { - auto* ptr = jkj::floff::floff(value, std::numeric_limits::max_digits10 - 1, first, fmt); - return { ptr, 0 }; + const auto abs_value = std::abs(value); + if (abs_value < 1E17 && abs_value > 1E-17) + { + if (value < 0) + { + *first = '-'; + ++first; + } + return boost::charconv::to_chars(first, last, static_cast(abs_value)); + } + else + { + auto* ptr = jkj::floff::floff(value, std::numeric_limits::max_digits10 - 1, first, fmt); + return { ptr, 0 }; + } } else if (fmt == boost::charconv::chars_format::scientific) { @@ -308,11 +322,14 @@ boost::charconv::to_chars_result boost::charconv::to_chars(char* first, char* la auto* ptr = jkj::floff::floff(value, precision, first, fmt); return { ptr, 0 }; } + /* else { std::snprintf( first, last - first, "%.*g", std::numeric_limits::max_digits10, value ); return { first + std::strlen(first), 0 }; } + */ + return { first + std::strlen(first), 0 }; } boost::charconv::to_chars_result boost::charconv::to_chars( char* first, char* last, long double value ) noexcept