From dddcecb0340f58fca9d45703a8d1efb6f0e946cc Mon Sep 17 00:00:00 2001 From: ToruNiina Date: Tue, 12 Mar 2019 23:37:46 +0900 Subject: [PATCH] fix: use snprintf instead of stringstream to avoid the effect of locale --- toml/serializer.hpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/toml/serializer.hpp b/toml/serializer.hpp index cb150bb..c4fb689 100644 --- a/toml/serializer.hpp +++ b/toml/serializer.hpp @@ -5,6 +5,7 @@ #include "value.hpp" #include "lexer.hpp" #include +#include namespace toml { @@ -30,13 +31,12 @@ struct serializer } std::string operator()(const toml::floating f) const { - std::string token = [=] { - // every float value needs decimal point (or exponent). - std::ostringstream oss; - oss << std::setprecision(float_prec_) << std::showpoint << f; - return oss.str(); - }(); + const auto fmt = "%.*g"; + const auto bsz = std::snprintf(nullptr, 0, fmt, int(this->float_prec_), f); + std::vector buf(bsz + 1, '\0'); // +1 for null character(\0) + std::snprintf(buf.data(), buf.size(), fmt, int(this->float_prec_), f); + std::string token(buf.begin(), buf.end()); if(token.back() == '.') // 1. => 1.0 { token += '0';