fix: use snprintf instead of stringstream

to avoid the effect of locale
This commit is contained in:
ToruNiina
2019-03-12 23:37:46 +09:00
parent 084e82a8a9
commit dddcecb034

View File

@@ -5,6 +5,7 @@
#include "value.hpp" #include "value.hpp"
#include "lexer.hpp" #include "lexer.hpp"
#include <limits> #include <limits>
#include <cstdio>
namespace toml namespace toml
{ {
@@ -30,13 +31,12 @@ struct serializer
} }
std::string operator()(const toml::floating f) const std::string operator()(const toml::floating f) const
{ {
std::string token = [=] { const auto fmt = "%.*g";
// every float value needs decimal point (or exponent). const auto bsz = std::snprintf(nullptr, 0, fmt, int(this->float_prec_), f);
std::ostringstream oss; std::vector<char> buf(bsz + 1, '\0'); // +1 for null character(\0)
oss << std::setprecision(float_prec_) << std::showpoint << f; std::snprintf(buf.data(), buf.size(), fmt, int(this->float_prec_), f);
return oss.str();
}();
std::string token(buf.begin(), buf.end());
if(token.back() == '.') // 1. => 1.0 if(token.back() == '.') // 1. => 1.0
{ {
token += '0'; token += '0';