MinGW中的数字格式设置更改
Number format setting change in MinGW
我正在使用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 中重现这一点,但非常感谢如何研究它的任何提示。
事实证明setLocale
和std::locale
是相互独立的。
在我的代码中的某个地方,我发现了一个导致问题的隐藏setLocale
。具体来说,我使用的是自定义gettext
实现,它需要setLocale
来更改语言。虽然这当然是可取的,但作为副作用,它也改变了数字格式。这是因为没有LC_MESSAGES
参数用于setLocale
。
所以 2 个解决方案:
- 重置C++区域设置,例如
std::locale::global(std::locale::classic());
或呼叫setLocale
后的初始呼叫 - 如果您依赖输出,请不要使用 lexical_cast。示例:使用速推。具有显式区域设置的区域设置。
相关文章:
- 如何以叮当格式设置评论的行长?
- Vulkan 中的动态顶点缓冲区格式设置
- 如何将多种语言设置放在单个 .clang 格式文件中
- 如何设置叮当格式的注释编译指示,以免触及多行doxygen注释?
- 如何禁用影响宏的clang格式设置
- 保证最大输出长度为双精度,并设置默认输出格式的精度
- 如何编辑格式设置以增加换行长度?
- 如何设计对象以不同方式设置文本格式
- 如何为输入设置变量编号和__android_log_print格式
- 使用无符号字符设置文本格式
- 如何设置数字格式以显示C 中的所有小数位数
- MinGW中的数字格式设置更改
- C++库以人类可读的格式存储设置
- CLANG 格式:禁用宏的格式设置
- 设置返回指向包含类的指针的函数的格式
- 实现区域设置格式的时间输出
- 各种操作系统的区域设置格式
- 提升区域设置格式
- Boost区域设置格式百分比
- 在 c++ 中设置格式 SQL 查询