我使用boost::lexical_cast<std::string>(double)将双字节转换为字符串,生成.NET解析的JSON序列化字节流。
我能够强制.NET使用InvariantCulture进行解析,从而在每种可能的语言上返回可预测的结果。
但是,我无法在投射文档中找到这种保证。我试了一下,对于不同的区域设置,它的工作方式是一样的。但是,我不能仅仅从几个测试中确定,我是在文档中遗漏了什么,还是根本无法保证这一点,而且我必须使用其他的东西?
编辑:我发现了一个问题。
std::locale::global(std::locale("Czech"));
std::cout << boost::lexical_cast<std::string>(0.15784465) << std::endl;返回0,15784465,这是不需要的。我可以强迫boost::lexical_cast<>不知道地区吗?
发布于 2013-09-24 12:22:38
我可以强迫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;发布于 2015-08-27 07:20:33
解决此问题的一个更好的解决方案是使用助推::现场而不是std::locale作为globale。来自文档
设置全局区域会产生坏副作用..。它甚至会影响printf和库(如boost::lexical_cast ),提供不正确或意外的格式设置。事实上,在这种情况下,许多第三方图书馆都被打破了。与标准的本地化库不同,Boost.Locale从不更改基本的数字格式,即使它使用基于std的本地化后端,因此在默认情况下,数字总是使用C样式的区域设置。本地化的数字格式需要特定的标志。
Boost locale要求您明确指定何时要知道数值格式,这与最近的库决策(如std::money_put )更加一致。
https://stackoverflow.com/questions/18980423
复制相似问题