【发布时间】:2016-11-15 23:13:14
【问题描述】:
我最近遇到了一个转换十进制字符串的错误,例如"10.057",到double。问题在于全球应用程序语言环境、boost::lexical_cast 的使用以及一些欧洲语言环境使用, 作为小数点这一事实。
scanf、printf 和该系列中的其他函数存在相同的问题。
我很想听听其他人如何处理这个问题。
【问题讨论】:
标签: c++ printf locale scanf lexical-cast
我最近遇到了一个转换十进制字符串的错误,例如"10.057",到double。问题在于全球应用程序语言环境、boost::lexical_cast 的使用以及一些欧洲语言环境使用, 作为小数点这一事实。
scanf、printf 和该系列中的其他函数存在相同的问题。
我很想听听其他人如何处理这个问题。
【问题讨论】:
标签: c++ printf locale scanf lexical-cast
scanf、printf、boost::lexical_cast 和相关函数的行为取决于全局应用程序区域设置。因此,它们的输入参数是不确定的。我见过这样的代码:
std::setlocale(LC_ALL, "C");
scanf(...);
但是,这不能保证在多线程环境中工作。
一种解决方案是使用允许用户明确指定语言环境的函数和类型。
iostream 流对象允许用户将语言环境指定为参数,这将产生确定性结果。
std::istringstream istr("10.057");
istr.imbue(std::locale::classic());
double val;
istr >> val;
同样,boost::format 允许用户将语言环境指定为参数。
using boost::format;
std::string s = str(format("%lf", std::locale::classic()) % 10.057);
另请参阅之前stackoverflow question 的讨论。
【讨论】: