2

我正在尝试使用特定_sprintf_l于 Windows 来根据德语语言环境格式化双精度;即逗号作为小数点,句点作为千位分隔符。简而言之,我希望“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”(即逗号作为小数分隔符)。

查看localeinfo->lconv struct调试器中的 表明 decimal_point 确实是逗号并且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。

非常感谢您的建议。

4

1 回答 1

2

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

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

于 2013-10-22T13:43:25.190 回答