繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM