diff --git a/core/src/text_serializer.cc b/core/src/text_serializer.cc index 71af4ab9..d26d3e58 100644 --- a/core/src/text_serializer.cc +++ b/core/src/text_serializer.cc @@ -1,21 +1,11 @@ #include "prometheus/text_serializer.h" -#include #include +#include #include #include -#include #include -#if __cpp_lib_to_chars >= 201611L -#include -#include -#include -#else -#include -#include -#endif - #include "prometheus/client_metric.h" #include "prometheus/metric_family.h" #include "prometheus/metric_type.h" @@ -31,26 +21,7 @@ void WriteValue(std::ostream& out, double value) { } else if (std::isinf(value)) { out << (value < 0 ? "-Inf" : "+Inf"); } else { - std::array buffer; - -#if __cpp_lib_to_chars >= 201611L - auto [ptr, ec] = - std::to_chars(buffer.data(), buffer.data() + buffer.size(), value); - if (ec != std::errc()) { - throw std::runtime_error("Could not convert double to string: " + - std::make_error_code(ec).message()); - } - out.write(buffer.data(), ptr - buffer.data()); -#else - auto wouldHaveWritten = - std::snprintf(buffer.data(), buffer.size(), "%.*g", - std::numeric_limits::max_digits10 - 1, value); - if (wouldHaveWritten <= 0 || - static_cast(wouldHaveWritten) >= buffer.size()) { - throw std::runtime_error("Could not convert double to string"); - } - out.write(buffer.data(), wouldHaveWritten); -#endif + out << value; } } @@ -217,11 +188,17 @@ void SerializeFamily(std::ostream& out, const MetricFamily& family) { void TextSerializer::Serialize(std::ostream& out, const std::vector& metrics) const { - std::locale saved_locale = out.getloc(); + auto saved_locale = out.getloc(); + auto saved_precision = out.precision(); + out.imbue(std::locale::classic()); + out.precision(std::numeric_limits::max_digits10 - 1); + for (auto& family : metrics) { SerializeFamily(out, family); } + out.imbue(saved_locale); + out.precision(saved_precision); } } // namespace prometheus