2013-09-24 60 views
6

的语言环境不变保证我使用boost::lexical_cast<std::string>(double)将双精度转换为字符串,从而生成JSON序列化的字节流,即由.NET分析的(在远程端)。boost :: lexical_cast <>

我可以强制.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<>不知道语言环境吗?

回答

5

我可以强制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; 
+4

基本上,问题在于C++语言环境不是线程本地的,RAII尊重的属性。 – MSalters

1

一个更好的解决这个问题是使用boost::locale,而不是一个std ::语言环境globale语言环境。从documentation

设置全局区域设置有坏的副作用......它影响甚至printf和库,例如升压:: lexical_cast的给予不正确的或意外的格式。事实上,许多第三方库在这种情况下被打破。 与标准本地化库不同,即使使用基于std的本地化后端,Boost.Locale也不会更改基本数字格式,因此默认情况下,数字始终使用C风格区域设置进行格式化。本地化数字格式需要特定的标志。

Boost语言环境要求您明确指定数字格式是否为区域感知,这与最近的库决定(如std :: money_put)更加一致。

+0

你如何使用boost :: lexical_cast? – Managarm

+0

boost :: lexical_cast使用全局区域设置。 boost :: locale库生成具有改进的数字格式化行为的语言环境(以及其他改进)。因此,只需将globale语言环境设置为boost语言环境,boost :: lexical_cast就会自动采用该行为。如果这还不清楚,让我知道,我会举个例子。 – Spacemoose

+0

这对我来说已经足够了:)谢谢! – Managarm

相关问题