C ++在全局范围内将语言环境重置为“C”?

时间:2013-06-19 23:08:17

标签: c++ locale cout stringstream comma

在我正在进行的项目中,我链接到一个专有的动态库。一旦我运行库的初始化函数,记录和打印数字的行为就会改变。

每隔三位小数插入一次逗号。即

cout << 123456789 << endl

用于打印123456789,现在打印123,456,789。这非常令人讨厌,因为这种行为不是我想要的。

此问题不仅在我正在编译的二进制文件中很明显,而且还显示在我链接到它的库中的所有coutsstringstreams中。

我在调用初始化函数

后尝试使用这行代码
setlocale(LC_ALL,"C");

认为它可能会将我的语言环境重置为默认值;但无济于事。逗号坚持!!

这段代码:

std::cout.imbue(std::locale("C"));

可以重置couts的语言区域,每个stringstream我也会应用它。但是,我真的需要在我链接到的每个库中声明的每个imbue上调用stringstream吗?有些库是专有的,我实际上无法更改其源代码。

必须有办法将区域设置全局重置为"C"吗?

1 个答案:

答案 0 :(得分:7)

我相信std::locale::global(std::locale("C"));应该做到这一点。见http://en.cppreference.com/w/cpp/locale/locale/global

请注意,这仅影响此次调用后创建的流。

其他库已经嵌入的任何流,例如cout,都必须重新灌输回所需的默认语言环境。

最后,我强烈建议针对您正在使用的库提交缺陷报告,因为单方面在初始化函数中进行如此惊人的全局更改是非常不合理的。