7

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

我能够强制 .NETInvariantCulture用于解析,从而在每种可能的语言上返回可预测的结果。

但是,我无法在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<>不知道语言环境吗?

4

2 回答 2

8

我可以强制 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;
于 2013-09-24T12:22:38.003 回答
2

解决此问题的更好方法是使用boost::locale而不是 std::locale 作为全局语言环境。从文档中:

设置全局语言环境有不好的副作用......它甚至会影响 printf 和像 boost::lexical_cast 这样的库,提供不正确或意外的格式。事实上很多第三方库都是在这种情况下崩溃的。与标准本地化库不同,Boost.Locale 从不更改基本数字格式,即使它使用基于 std 的本地化后端,所以默认情况下,数字总是使用 C 风格的语言环境进行格式化。本地化数字格式需要特定的标志。

Boost 语言环境要求您明确指定何时希望数字格式能够感知语言环境,这与 std::money_put 等最近的库决策更加一致。

于 2015-08-27T07:20:33.213 回答