首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::lexical_cast<>的局部不变保证

boost::lexical_cast<>的局部不变保证
EN

Stack Overflow用户
提问于 2013-09-24 11:31:14
回答 2查看 2.9K关注 0票数 8

我使用boost::lexical_cast<std::string>(double)将双字节转换为字符串,生成.NET解析的JSON序列化字节流。

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

但是,我无法在投射文档中找到这种保证。我试了一下,对于不同的区域设置,它的工作方式是一样的。但是,我不能仅仅从几个测试中确定,我是在文档中遗漏了什么,还是根本无法保证这一点,而且我必须使用其他的东西?

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

代码语言:javascript
复制
std::locale::global(std::locale("Czech")); 
std::cout << boost::lexical_cast<std::string>(0.15784465) << std::endl;

返回0,15784465,这是不需要的。我可以强迫boost::lexical_cast<>不知道地区吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-24 12:22:38

我可以强迫boost::lexical_cast<>不知道地区吗?

不我不认为那是可能的。你能做的就是打电话

代码语言:javascript
复制
std::locale::global(std::locale::classic());

若要将全局区域设置为"C“区域设置,boost::lexical_cast依赖于全局区域设置。但是,问题是,如果代码中的其他地方在调用boost::lexical_cast之前将全局区域设置为其他地方,那么您仍然会遇到相同的问题。因此,一个健壮的解决方案将是imbue --一个类似于这样的字符串流,您可以始终确保这样做是可行的:

代码语言:javascript
复制
std::ostringstream oss;
oss.imbue(std::locale::classic());
oss.precision(std::numeric_limits<double>::digits10);
oss << 0.15784465;
票数 8
EN

Stack Overflow用户

发布于 2015-08-27 07:20:33

解决此问题的一个更好的解决方案是使用助推::现场而不是std::locale作为globale。来自文档

设置全局区域会产生坏副作用..。它甚至会影响printf和库(如boost::lexical_cast ),提供不正确或意外的格式设置。事实上,在这种情况下,许多第三方图书馆都被打破了。与标准的本地化库不同,Boost.Locale从不更改基本的数字格式,即使它使用基于std的本地化后端,因此在默认情况下,数字总是使用C样式的区域设置。本地化的数字格式需要特定的标志。

Boost locale要求您明确指定何时要知道数值格式,这与最近的库决策(如std::money_put )更加一致。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18980423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档