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'; } } |
スポンサード リンク |
この記事のカテゴリ
- C++ ⇒ Visual C++の金額書式情報 その2