MSVCRT的printf无千位分隔?求CRT locale属性实现情况官方文档
关于MSVCRT中printf系列函数区域设置行为的疑问及说明
在Windows系统下使用Microsoft CRT库(MSVCRT)时,printf/_snprintf/_snprintf_s/_snprintf_s_l等函数会在一定程度上遵循当前线程的CRT区域设置,但它们不会自动处理千位分隔分组,对吗?
我编写了以下测试代码验证这一行为:
int i1 = 7654321; double d1 = 1234567.89; char *locret = nullptr; setvbuf(stdout, NULL, _IONBF, 0); locret = setlocale(LC_ALL, "en-US"); assert(locret); printf("en-US: %d | %.3f\n", i1, d1); locret = setlocale(LC_ALL, "de-DE"); assert(locret); printf("de-DE: %d | %.3f\n", i1, d1);
在VS2019中编译运行后,得到以下输出:
en-US: 7654321 | 1234567.890 de-DE: 7654321 | 1234567,890
可以看到,小数点字符会随区域设置变化(德语区使用逗号作为小数点),但千位分隔并未生效。
调用localeconv()返回的lconv结构体中能看到分组信息.grouping=0x03,但该信息并未被MSVCRT内部用于格式化输出,千位分隔需要应用程序自行处理。
核心疑问:微软是否提供官方文档,明确列出CRT区域设置中哪些属性已实现、哪些未实现?
如果没有这类明确信息,建议避免依赖CRT层的“区域性”属性,转而使用WinAPI层Winnls.h中的区域设置函数会更可靠。例如,使用SetThreadLocale()设置当前线程的WinAPI区域设置,再调用GetNumberFormat()即可实现千位分隔。
更新
现在明确了,MSDN文档中有相关说明,但表述较为隐晦:千位分隔符仅会体现在localeconv()返回的lconv结构体中,不会影响printf的行为。因此.grouping不影响printf的情况也在意料之中。
内容的提问来源于stack exchange,提问作者Jimm Chen
相关产品推荐
相关产品推荐

