|
@@ -42,6 +42,7 @@
|
|
|
|
|
|
#include <google/protobuf/stubs/logging.h>
|
|
#include <google/protobuf/stubs/logging.h>
|
|
#include <google/protobuf/stubs/stl_util.h>
|
|
#include <google/protobuf/stubs/stl_util.h>
|
|
|
|
+#include <google/protobuf/io/strtod.h>
|
|
|
|
|
|
#ifdef _WIN32
|
|
#ifdef _WIN32
|
|
// MSVC has only _snprintf, not snprintf.
|
|
// MSVC has only _snprintf, not snprintf.
|
|
@@ -1287,7 +1288,7 @@ char* DoubleToBuffer(double value, char* buffer) {
|
|
// of a double. This long double may have extra bits that make it compare
|
|
// of a double. This long double may have extra bits that make it compare
|
|
// unequal to "value" even though it would be exactly equal if it were
|
|
// unequal to "value" even though it would be exactly equal if it were
|
|
// truncated to a double.
|
|
// truncated to a double.
|
|
- volatile double parsed_value = strtod(buffer, nullptr);
|
|
|
|
|
|
+ volatile double parsed_value = io::NoLocaleStrtod(buffer, nullptr);
|
|
if (parsed_value != value) {
|
|
if (parsed_value != value) {
|
|
int snprintf_result =
|
|
int snprintf_result =
|
|
snprintf(buffer, kDoubleToBufferSize, "%.*g", DBL_DIG+2, value);
|
|
snprintf(buffer, kDoubleToBufferSize, "%.*g", DBL_DIG+2, value);
|
|
@@ -1339,7 +1340,7 @@ bool safe_strtof(const char* str, float* value) {
|
|
char* endptr;
|
|
char* endptr;
|
|
errno = 0; // errno only gets set on errors
|
|
errno = 0; // errno only gets set on errors
|
|
#if defined(_WIN32) || defined (__hpux) // has no strtof()
|
|
#if defined(_WIN32) || defined (__hpux) // has no strtof()
|
|
- *value = strtod(str, &endptr);
|
|
|
|
|
|
+ *value = io::NoLocaleStrtod(str, &endptr);
|
|
#else
|
|
#else
|
|
*value = strtof(str, &endptr);
|
|
*value = strtof(str, &endptr);
|
|
#endif
|
|
#endif
|
|
@@ -1348,7 +1349,7 @@ bool safe_strtof(const char* str, float* value) {
|
|
|
|
|
|
bool safe_strtod(const char* str, double* value) {
|
|
bool safe_strtod(const char* str, double* value) {
|
|
char* endptr;
|
|
char* endptr;
|
|
- *value = strtod(str, &endptr);
|
|
|
|
|
|
+ *value = io::NoLocaleStrtod(str, &endptr);
|
|
if (endptr != str) {
|
|
if (endptr != str) {
|
|
while (ascii_isspace(*endptr)) ++endptr;
|
|
while (ascii_isspace(*endptr)) ++endptr;
|
|
}
|
|
}
|