Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用_sprintf_l将double与数千个sep一起格式化_C_Windows_Visual Studio 2008_Locale - Fatal编程技术网

C 使用_sprintf_l将double与数千个sep一起格式化

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

我正在尝试使用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;

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环境。