MinGW中的数字格式设置更改

Number format setting change in MinGW

本文关键字:设置 格式 数字 MinGW      更新时间:2023-10-16

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

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

//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 中重现这一点,但非常感谢如何研究它的任何提示。

事实证明setLocalestd::locale是相互独立的。

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

所以 2 个解决方案:

  1. 重置C++区域设置,例如 std::locale::global(std::locale::classic());或呼叫setLocale后的初始呼叫
  2. 如果您依赖输出,请不要使用 lexical_cast。示例:使用速推。具有显式区域设置的区域设置。