我正在使用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中重现这一点,但感谢任何有关如何调查此内容的提示。
答案 0 :(得分:0)
结果setLocale
和std::locale
相互独立。
在我的代码的某处,我发现一个隐藏的setLocale
导致了这个问题。具体来说,我使用的是自定义gettext
实现,需要setLocale
来更改语言。虽然这当然是可取的,但作为副作用,它也会改变数字格式。这是因为LC_MESSAGES
没有setLocale
参数。
所以2个解决方案:
std::locale::global(std::locale::classic());
或致电setLocale