From dddcecb0340f58fca9d45703a8d1efb6f0e946cc Mon Sep 17 00:00:00 2001 From: ToruNiina Date: Tue, 12 Mar 2019 23:37:46 +0900 Subject: [PATCH 1/2] 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'; From 46b35870c55356824a11078b483c40f0dea20d1d Mon Sep 17 00:00:00 2001 From: ToruNiina Date: Wed, 13 Mar 2019 01:17:27 +0900 Subject: [PATCH 2/2] style: remove needless type casting --- toml/serializer.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/toml/serializer.hpp b/toml/serializer.hpp index c4fb689..c25f8b2 100644 --- a/toml/serializer.hpp +++ b/toml/serializer.hpp @@ -32,9 +32,9 @@ struct serializer std::string operator()(const toml::floating f) const { const auto fmt = "%.*g"; - const auto bsz = std::snprintf(nullptr, 0, fmt, int(this->float_prec_), f); + const auto bsz = std::snprintf(nullptr, 0, fmt, 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::snprintf(buf.data(), buf.size(), fmt, this->float_prec_, f); std::string token(buf.begin(), buf.end()); if(token.back() == '.') // 1. => 1.0