diff options
| author | Wladimir J. van der Laan <[email protected]> | 2015-07-18 08:16:21 +0200 |
|---|---|---|
| committer | Wladimir J. van der Laan <[email protected]> | 2015-07-18 09:04:18 +0200 |
| commit | ec249d4a1d572a17dd010464fe3ead532a8b1b70 (patch) | |
| tree | 26bb1be16831c3e74a13975c661c3d6cb4b7b561 /src/utilstrencodings.cpp | |
| parent | univalue: Avoid unnecessary roundtrip through double for numbers (diff) | |
| download | discoin-ec249d4a1d572a17dd010464fe3ead532a8b1b70.tar.xz discoin-ec249d4a1d572a17dd010464fe3ead532a8b1b70.zip | |
util: use locale-independent parsing in ParseDouble
Use locale-indepent C++ based parsing instead of C's strtod,
which checks for different input based on the user's locale.
Fixes #6443.
Diffstat (limited to 'src/utilstrencodings.cpp')
| -rw-r--r-- | src/utilstrencodings.cpp | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/utilstrencodings.cpp b/src/utilstrencodings.cpp index 7208ca947..1f7a2cae2 100644 --- a/src/utilstrencodings.cpp +++ b/src/utilstrencodings.cpp @@ -464,11 +464,12 @@ bool ParseDouble(const std::string& str, double *out) return false; if (str.size() >= 2 && str[0] == '0' && str[1] == 'x') // No hexadecimal floats allowed return false; - char *endp = NULL; - errno = 0; // strtod will not set errno if valid - double n = strtod(str.c_str(), &endp); - if(out) *out = n; - return endp && *endp == 0 && !errno; + std::istringstream text(str); + text.imbue(std::locale::classic()); + double result; + text >> result; + if(out) *out = result; + return text.eof() && !text.fail(); } std::string FormatParagraph(const std::string& in, size_t width, size_t indent) |