0

我最近遇到了一个将十进制字符串转换"10.057"double. 问题在于全球应用程序语言环境、一些欧洲语言环境使用 a作为小数点的使用boost::lexical_cast以及事实。,

scanfprintf并且该系列中的其他功能也有同样的问题。

我很想听听其他人如何处理这个问题。

4

1 回答 1

0

scanfprintf和相关函数的行为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 问题的讨论。

于 2016-11-15T23:13:14.360 回答