MinGW中的数字格式设置更改

时间:2017-11-05 13:14:57

标签: c++ windows mingw locale

我正在使用CMake和MinGW编译一个更大的项目(g++.exe (MinGW.org GCC-6.3.0-1) 6.3.0)。

一开始我设置了一个boost生成的语言环境并尝试格式化:

//Global
std::locale myLoc;

    // Init function
    std::locale newLocale(boost::locale::generator().generate("C"));
    std::locale::global(newLocale);
    std::cerr << 1.1234 << std::endl;
    myLoc = std::locale();

后来我想再次输出这个数字,但突然我又有一个小数点(,,因为我在德国系统上)但是语言环境似乎没有改变。

std::cerr << (std::locale() == myLoc) << std::endl;
std::cerr << boost::lexical_cast<std::string>(1.1234) << std::endl;
std::cerr << std::use_facet<std::numpunct<char> >(std::locale()).decimal_point() << std::endl;

输出结果为:

1.1234
1
1,1234
.

总的来说:格式化首先工作,语言环境仍然相同,decimal_point仍然返回.但我得到,。这怎么可能?

我无法在MWE中重现这一点,但感谢任何有关如何调查此内容的提示。

1 个答案:

答案 0 :(得分:0)

结果setLocalestd::locale相互独立。

在我的代码的某处,我发现一个隐藏的setLocale导致了这个问题。具体来说,我使用的是自定义gettext实现,需要setLocale来更改语言。虽然这当然是可取的,但作为副作用,它也会改变数字格式。这是因为LC_MESSAGES没有setLocale参数。

所以2个解决方案:

  1. 使用以下方法重置C ++语言环境: std::locale::global(std::locale::classic());或致电setLocale
  2. 后的初始通话
  3. 如果您依赖输出,请不要使用lexical_cast。示例:将boost.Locale与显式语言环境一起使用。