Mac系统下C++程序获取的小数点分隔符与系统设置不一致问题
原因分析
- 首先是代码写法错误:你调用的
std::locale()是默认构造函数,生成的是当前程序全局locale的副本,程序启动时默认全局locale为C标准locale,强制使用.作为小数点,你相当于把全局locale重新设置为默认的C locale,自然读不到系统自定义配置。想要加载系统用户配置的区域格式,需要使用带空字符串参数的构造函数std::locale(""),该构造函数才会读取当前系统的区域配置生成对应的locale实例。 - 其次是macOS平台的机制差异:Windows的C标准库会直接读取系统内核存储的区域设置,所以修改系统设置后直接生效;但macOS的libc标准库依赖POSIX标准的locale环境变量(
LANG、LC_ALL等)来判断区域格式,你在系统偏好设置图形界面修改的小数点配置,默认不会同步到终端进程的环境变量中,所以程序读不到修改后的配置。
解决方法
- 修正代码中的locale设置行,修改为:
std::locale::global(std::locale(""));
- 要让程序读取到你设置的逗号小数点配置,可二选一操作:
- 运行程序前在终端执行对应locale的环境变量设置,比如法语区格式命令为
export LC_ALL=fr_FR.UTF-8,再运行程序即可返回逗号作为小数点 - 如果需要系统偏好设置的修改自动生效,可在shell配置文件(zsh对应
~/.zshrc,bash对应~/.bash_profile)中添加一行export LC_ALL=$(defaults read -g AppleLocale).UTF-8,重启终端后每次启动的进程都会自动继承系统图形界面的区域配置。
内容的提问来源于stack exchange,提问作者Soro
相关产品推荐
相关产品推荐

