Commit a5c51157 authored by Björn Reimer's avatar Björn Reimer Committed by Wouter van Oortmerssen

Fix conversion of floats when generating json

Change-Id: I01def42eda9b70308046c048099d85db8f889ede
parent ac10873e
...@@ -42,10 +42,8 @@ namespace flatbuffers { ...@@ -42,10 +42,8 @@ namespace flatbuffers {
// Convert an integer or floating point value to a string. // Convert an integer or floating point value to a string.
// In contrast to std::stringstream, "char" values are // In contrast to std::stringstream, "char" values are
// converted to a string of digits. // converted to a string of digits, and we don't use scientific notation.
template<typename T> std::string NumToString(T t) { template<typename T> std::string NumToString(T t) {
// to_string() prints different numbers of digits for floats depending on
// platform and isn't available on Android, so we use stringstream
std::stringstream ss; std::stringstream ss;
ss << t; ss << t;
return ss.str(); return ss.str();
...@@ -58,6 +56,26 @@ template<> inline std::string NumToString<unsigned char>(unsigned char t) { ...@@ -58,6 +56,26 @@ template<> inline std::string NumToString<unsigned char>(unsigned char t) {
return NumToString(static_cast<int>(t)); return NumToString(static_cast<int>(t));
} }
// Special versions for floats/doubles.
template<> inline std::string NumToString<double>(double t) {
// to_string() prints different numbers of digits for floats depending on
// platform and isn't available on Android, so we use stringstream
std::stringstream ss;
// Use std::fixed to surpress scientific notation.
ss << std::fixed << t;
auto s = ss.str();
// Sadly, std::fixed turns "1" into "1.00000", so here we undo that.
auto p = s.find_last_not_of('0');
if (p != std::string::npos) {
s.resize(p + 1); // Strip trailing zeroes.
if (s.back() == '.') s.pop_back(); // Strip '.' if a whole number.
}
return s;
}
template<> inline std::string NumToString<float>(float t) {
return NumToString(static_cast<double>(t));
}
// Convert an integer value to a hexadecimal string. // Convert an integer value to a hexadecimal string.
// The returned string length is always xdigits long, prefixed by 0 digits. // The returned string length is always xdigits long, prefixed by 0 digits.
// For example, IntToStringHex(0x23, 8) returns the string "00000023". // For example, IntToStringHex(0x23, 8) returns the string "00000023".
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment