我最近遇到了一个将十进制字符串转换"10.057"
为double
. 问题在于全球应用程序语言环境、一些欧洲语言环境使用 a作为小数点的使用boost::lexical_cast
以及事实。,
scanf
,printf
并且该系列中的其他功能也有同样的问题。
我很想听听其他人如何处理这个问题。
我最近遇到了一个将十进制字符串转换"10.057"
为double
. 问题在于全球应用程序语言环境、一些欧洲语言环境使用 a作为小数点的使用boost::lexical_cast
以及事实。,
scanf
,printf
并且该系列中的其他功能也有同样的问题。
我很想听听其他人如何处理这个问题。
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 问题的讨论。