桜、抹茶、白、日記

名古屋市在住のC++使いのcoderの日記だったもの。

数値の3桁区切り

d:id:youandi:20071109#p1
先日ネタにしたLinuxのprintfでは「'」で数値の3桁区切り可能なんだけど、今日はWindows上で数値の3桁区切りを実現する事に・・・。で実装を考えようとした際に使えそうなWin32APIがある事を思い出した。

数字文字列を、指定したロケールの通貨文字列として書式化します。

ちょっと試してみるかな。

#define STRICT 1
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <locale.h>

int _tmain( int argc, int, TCHAR* argv[], TCHAR* envp[] )
{
  (void)::_tsetlocale( LC_ALL, _T("") );

  const TCHAR szNumber[] = _T("-123456789.123");
  TCHAR       szBuff[ 31 + 1 ];
  CURRENCYFMT stCurrency;

  szBuff[ 0 ] = szBuff[ 31 ] = 0;
  (void)::ZeroMemory( &stCurrency, sizeof( stCurrency ) );
  stCurrency.NumDigits        = 3;		// LOCALE_IDIGITS
  stCurrency.LeadingZero      = 0;		// LOCALE_ILZERO
  stCurrency.Grouping         = 3;		// 0〜9
  stCurrency.lpDecimalSep     = _T(".");
  stCurrency.lpThousandSep    = _T(",");
  stCurrency.NegativeOrder    = 2;		// LOCALE_INEGCURR
  stCurrency.PositiveOrder    = 0;		// LOCALE_ICURRENCY
  stCurrency.lpCurrencySymbol = _T("");

  (void)::GetCurrencyFormat( NULL, 0, szNumber, &stCurrency, szBuff, 31 );

  _ftprintf( stdout, _T("%s\n"), szBuff );
  (void)::fgetc( stdin );
  return 0;
}

実行結果

-123,456,789.123