使用_sprintf_l来使用thousands_sep格式化double

我正在尝试使用Windows特定的_sprintf_l来根据德语区域设置格式化一个double; 即逗号作为千位分隔符的小数点和句点。 总之,我想“123456.789”看“123.456,79”(如果只打印两位小数)。

然而,千位分隔符不是在踢:

 char *loc = setlocale(LC_NUMERIC, "German"); double val = 123456.789; char buffer[32] = {0}; _locale_t localeinfo; localeinfo = _get_current_locale(); _sprintf_l(buffer, "%.2f", localeinfo, val); printf("%s\n", buffer); 

结果:“123456,79”(即逗号作为小数点分隔符)。

在debugging器中localeinfo->lconv struct显示localeinfo->lconv struct确实是逗号,而thousands_sep是句点,所以这很奇怪。

我需要处理的_sprintf_l有什么特别的注意事项?

当POSIX / XPG4可用时,我可以这样做:

 #define _XOPEN_SOURCE #include <locale.h> // char *s = setlocale(LC_NUMERIC, "De_DE.IBM-1141"); double d = 123456.789; char s1[100]; printf("%s %'.2f\n", s, d); 

…打印预期123.456,79。

非常感谢您的build议。

你的代码是正确的。 令人惊讶的是,似乎“_l”版本根本不起作用。 并将永远不会工作(关闭wontfix!)

https://connect.microsoft.com/VisualStudio/feedback/details/523503/sprintf-l-and-vsnprintf-l-and-relatives-does-not-respect-passed-locale