boost :: lexical_cast<>的locale不变保证

时间:2013-09-24 11:31:15

标签: c++ serialization boost invariantculture

我正在使用boost::lexical_cast<std::string>(double)将双精度转换为字符串,生成JSON序列化字节流,即(在远程端)由.NET解析。

我能够强制.NET使用InvariantCulture进行解析,从而为每种可能的语言返回可预测的结果。

但是,我无法在boost::lexical_cast文档中找到此保证。我尝试了一下,它对于不同的语言环境设置的工作方式相同。但是,我不能确定只有少数测试,我在文档中遗漏了什么,或者这根本不能保证,我必须使用别的东西?

编辑: 我发现了一个问题。

std::locale::global(std::locale("Czech")); 
std::cout << boost::lexical_cast<std::string>(0.15784465) << std::endl;

返回0,15784465,这是不受欢迎的。我可以强制boost::lexical_cast<>不要注意区域设置吗?

1 个答案:

答案 0 :(得分:5)

  

我可以强制使用boost :: lexical_cast&lt;&gt;不要注意语言环境?

不,我不认为这是可能的。你能做的最好的就是打电话

std::locale::global(std::locale::classic());

将全局语言环境设置为“C”语言环境,因为boost::lexical_cast依赖于全局语言环境。但是,问题是如果代码中的其他位置在调用boost::lexical_cast之前将全局语言环境设置为其他内容,那么您仍然会遇到相同的问题。 因此,一个强大的解决方案是imbue这样的字符串流,你总能确定这是有效的:

std::ostringstream oss;
oss.imbue(std::locale::classic());
oss.precision(std::numeric_limits<double>::digits10);
oss << 0.15784465;