2012年12月17日追記:これはVisual C++ 2012で利用できるすべてのロケールを網羅したものではありません。また、ソースコードにも誤りがありました(m.neg_format()とすべきところをm.pos_format()としていました)。これらを修正したVisual C++の金額書式情報・完全版 その2をご覧ください。

前回に引き続き、Visual C++における金額書式にはどのような様式が存在するかを調べました。

今回は、moneypunctファセットクラスのメンバ関数、pos_formatとneg_formatの返す値を見てみました。それぞれ、正の値・負の値における書式を返す関数で、戻り値は以下に示すstd::money_base::pattern型です。pattern::fieldの各要素はpert型の値です。たとえば、fieldが{sign, symbol, space, value}であれば、「符号、空白、通貨記号、値」の順に並べることを意味します。

class money_base {
public:
  enum part {none, space, symbol, sign, value};
  struct pattern {char field[4];};
};

結果はこのように4種類に分かれました。試したすべての地域においてpos_formatとneg_formatは同一の結果だったので、以下の表では区別していません。前回同様、Visual C++ 2012、Windows 8 RTMともに日本語版を使用しました。

国・地域 field[0] field[1] field[2] field[3]
ena_aus sign symbol value none
enc_can
cht_hkg
jpn_jpn
kor_kor
esm_mex
Engthsh_sgp
cht_twn
eng_gbr
enu_usa
ptb_bra sign symbol space value
dan_dnk
nor_nor
chs_chn symbol sign value none
csy_cze sign value space symbol
deu_deu
hun_hun
isl_isl
plk_pol
rus_rus
sve_swe
trk_tur

プログラムはこちらです。

#include <iostream>
#include <iomanip>
#include <locale>
 
using namespace std;
 
void put_part(ostream& os, int p)
{
  switch (p)
  {
  case money_base::none: os << "1"; break;
  case money_base::space: os << "2"; break;
  case money_base::symbol: os << "3"; break;
  case money_base::sign: os << "4"; break;
  case money_base::value: os << "5"; break;
  }
}
 
void f(locale const& l)
{
  auto const& m = use_facet<moneypunct<char>>(l);
  money_base::pattern pp = m.pos_format();
  money_base::pattern pn = m.pos_format();
 
  for (int x : pp.field)
  {
    put_part(cout, x);
    cout << ' ';
  }
  for (int x : pn.field)
  {
    put_part(cout, x);
    cout << ' ';
  }
}
 
int main()
{
  char const *locs[] = {
    "ena_aus",
    "ptb_bra",
    "enc_can",
    "chs_chn",
    "csy_cze",
    "dan_dnk",
    "deu_deu",
    "cht_hkg",
    "hun_hun",
    "isl_isl",
    "jpn_jpn",
    "kor_kor",
    "esm_mex",
    "nor_nor",
    "plk_pol",
    "rus_rus",
    "English_sgp",
    "sve_swe",
    "des_che",
    "cht_twn",
    "trk_tur",
    "eng_gbr",
    "enu_usa",
  };
 
  for (auto s : locs)
  {
    cout << s << "\t";
    f(locale(s));
    cout << '\n';
  }
}

スポンサード リンク

この記事のカテゴリ

  • ⇒ Visual C++の金額書式情報 その2