[英]Locale invariant guarantee of boost::lexical_cast<>
我正在使用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<>
不要知道语言环境吗?
我可以强制boost :: lexical_cast <>不要知道语言环境吗?
不,我不认为这是可能的。 你能做的最好的就是打电话
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;
解决此问题的更好方法是使用boost :: locale而不是std :: locale作为globale语言环境。 从文档 :
设置全局语言环境有不好的副作用...它甚至影响printf和boost :: lexical_cast等库提供不正确或意外的格式。 事实上,在这种情况下,许多第三方图书馆都被打破了。 与标准本地化库不同,Boost.Locale从不更改基本数字格式,即使它使用基于std的本地化后端,因此默认情况下,数字始终使用C样式语言环境进行格式化。 本地化数字格式需要特定标志。
Boost语言环境要求您明确指定何时希望数字格式设置为语言环境,这与最近的库决策(如std :: money_put)更为一致。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.