【问题标题】:Using _sprintf_l to format double with thousands_sep使用 _sprintf_l 以数千个_sep 格式化双精度
【发布时间】:2012-09-28 11:37:08
【问题描述】:

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

非常感谢您的建议。

【问题讨论】:

  • 这会有帮助吗 - stackoverflow.com/a/7276879/763026
  • 谢谢,但那是非常 C++。我特别想知道为什么 _sprintf_l 不使用语言环境所说的应该使用的数千个 sep,或者我做错了什么。不太习惯 WIN32 环境。

标签: c windows visual-studio-2008 locale


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-07
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    相关资源
    最近更新 更多