C 使用_sprintf_l将double与数千个sep一起格式化
我正在尝试使用Windows特有的C 使用_sprintf_l将double与数千个sep一起格式化,c,windows,visual-studio-2008,locale,C,Windows,Visual Studio 2008,Locale,我正在尝试使用Windows特有的\u sprintf\u l根据德语地区设置double的格式;即逗号作为小数点,句点作为千位分隔符。简而言之,我希望“123456.789”看起来像“123.456,79”(如果只打印两个小数) 但是,千位分隔符并没有起作用: char *loc = setlocale(LC_NUMERIC, "German"); double val = 123456.789; char buffer[32] = {0}; _locale_t localeinfo; lo
\u sprintf\u 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”(即逗号作为小数分隔符)
查看调试器中的localeinfo->lconv结构
,可以发现小数点实际上是逗号,single\u sep
是句点,所以这很奇怪
我需要处理\u sprintf\u 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);
定义源代码
#包括
//
char*s=setlocale(LC_NUMERIC,“De_De.IBM-1141”);
双d=123456.789;
chars1[100];
printf(“%s%”.2f\n“,s,d);
…打印预期的123.456,79
非常感谢您的建议。您的代码是正确的。令人惊讶的是,“l”版本似乎根本不起作用。而且永远不会工作(关闭为wontfix!)
这会有帮助吗?谢谢,但是这是非常C++的。我特别想知道为什么Sprintful不使用本地区所说的数千sep,或者如果我做错了什么。不太习惯WIN32环境。