2

_sprintf_lドイツ語のロケールに従って double をフォーマットするために Windows 固有のものを使用しようとしています。つまり、小数点としてのコンマと千単位の区切りとしてのピリオドです。要するに、「123456.789」を「123.456,79」のようにしたいと思います (小数点以下 2 桁のみを表示する場合)。

ただし、千単位の区切り記号は機能していません。

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 structdecimal_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 に答える