diff --git a/src/libs/nanotrace/staticstring.h b/src/libs/nanotrace/staticstring.h index d787bd2fe30..0cd85ae5fca 100644 --- a/src/libs/nanotrace/staticstring.h +++ b/src/libs/nanotrace/staticstring.h @@ -5,14 +5,17 @@ #include -#if !(defined(__cpp_lib_to_chars) && (__cpp_lib_to_chars >= 201611L)) -# include -#endif - #include #include #include +#if !defined(__cpp_lib_to_chars) || (__cpp_lib_to_chars < 201611L) || \ + (defined(__GNUC__) && __GNUC__ < 11) || \ + (defined(_MSC_VER) && _MSC_VER < 1930) || \ + (defined(__clang_major__) && __clang_major__ < 14) +#define NO_STD_FLOAT_TO_CHARS 1 +#endif + namespace NanotraceHR { template @@ -58,10 +61,14 @@ public: template, bool> = true> void append(Type number) { -#if !(defined(__cpp_lib_to_chars) && (__cpp_lib_to_chars >= 201611L)) +#if NO_STD_FLOAT_TO_CHARS + // Fallback using snprintf with sufficient precision. if constexpr (std::is_floating_point_v) { - QLocale locale{QLocale::Language::C}; - append(locale.toString(number).toStdString()); + char buffer[std::numeric_limits::max_digits10 + 2]; + auto size = std::snprintf(buffer, sizeof(buffer), "%.9f", number); + + if (size >= 0) + append({buffer, size}); return; } #endif