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

not*_*row 6 c++ serialization boost invariantculture

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;
Run Code Online (Sandbox Code Playgroud)

返回0,15784465,这是不受欢迎的.我可以强迫boost::lexical_cast<>不要知道语言环境吗?

Jes*_*ood 5

我可以强制boost :: lexical_cast <>不要知道语言环境吗?

不,我不认为这是可能的.你能做的最好的就是打电话

std::locale::global(std::locale::classic());
Run Code Online (Sandbox Code Playgroud)

将全局语言环境设置为"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;
Run Code Online (Sandbox Code Playgroud)

  • 从根本上说,问题是C++语言环境不是线程本地的,与RAII相关的属性. (4认同)