Visual C++の金額書式情報・完全版に続き、Visual C++の金額書式情報 その2の調査し直したものです。EnumSystemLocalesExで得られたすべてのロケールに対するmoneypunctの結果を一覧にしています。

一番下に使用したプログラムのソースコードを載せています。

今回、正の場合と負の場合とで書式が異なる地域が存在することに気付きました(前回はプログラムのミスもありましたが)。

国・地域
[0][1][2][3][0][1][2][3]
ARA_SAUsymbolspacevaluesignsymbolvaluesignnone
ASM_INDsymbolsignspacevaluesymbolsignspacevalue
BNG_IND
DAN_DNK
FOS_FRO
FYN_NLD
GUJ_IND
HIN_IND
KAL_GRL
KDI_IND
KNK_IND
MAR_IND
MYM_IND
NLD_NLD
NON_NOR
NOR_NOR
NOR_NOR
ORI_IND
PAN_IND
SAN_IND
SME_NOR
TAM_IND
TEL_IND
AFK_ZAFsymbolsignspacevaluesymbolsignvaluenone
HAU_NGA
HAU_NGA
HEB_ISR
IBO_NGA
NSO_ZAF
RMC_CHE
TSN_ZAF
XHO_ZAF
ZUL_ZAF
BOB_CHNsymbolsignvaluenonesymbolsignvaluenone
CHS_CHN
CHS_CHN
III_CHN
KUR_IRQ
KUR_IRQ
MNG_CHN
UIG_CHN
FAR_IRNsymbolvaluesignnonesymbolvaluesignnone
PAS_AFG
PRS_AFG
URD_PAK
ITA_ITAsignsymbolspacevaluesignsymbolspacevalue
LVI_LVA
MPD_CHL
PAN_PAK
PTB_BRA
QUB_BOL
SIN_LKA
SIN_PAK
SIN_PAK
YOR_NGA
AMH_ETHsignsymbolvaluenonesignsymbolvaluenone
CHT_HKG
CRE_USA
CRE_USA
CYM_GBR
ENU_USA
FPO_PHL
GLA_GBR
HAW_USA
IND_IDN
IRE_IRL
IUK_CAN
IUK_CAN
IUS_CAN
IVL_IVC
JPN_JPN
KKZ_KAZ
KOR_KOR
MLT_MLT
MRI_NZL
MSL_MYS
MWK_CAN
NEP_NEP
QUT_GTM
SWK_KEN
THA_THA
AZC_AZEsignvaluespacesymbolsignvaluespacesymbol
AZE_AZE
AZE_AZE
BAS_RUS
BEL_BLR
BGR_BGR
BRE_FRA
BSB_BIH
BSB_BIH
BSC_BIH
CAT_ESP
COS_FRA
CSY_CZE
DEU_DEU
DSB_GER
ELL_GRC
ESP_ESP
ETI_EST
EUQ_ESP
FIN_FIN
FRA_FRA
FUL_SEN
FUL_SEN
GLC_ESP
GSW_FRA
HRV_HRV
HSB_GER
HUN_HUN
HYE_ARM
ISL_ISL
KAT_GEO
KIN_RWA
KYR_KGZ
LAO_LAO
LBX_LUX
LTH_LTU
MKI_MKD
MNN_MNG
MON_MNG
OCI_FRA
PLK_POL
ROM_ROM
RUS_RUS
SKY_SVK
SLV_SVN
SMB_SWE
SMK_SWE
SMN_FIN
SMS_FIN
SQI_ALB
SRB_SRB
SRM_SRB
SRO_SRB
SVE_SWE
SYR_SYR
TAJ_TAJ
TAJ_TAJ
TRK_TUR
TTT_RUS
TZM_DZA
TZM_DZA
TZM_MAR
UZB_UZB
UZB_UZB
UZB_UZB
VIT_VNM
WOL_SEN
KHM_KHMsignvaluesymbolnonesignvaluesymbolnone
SAH_RUS
TUK_TKM
UKR_UKR
DIV_MDVvaluespacesymbolsignvaluespacesymbolsign
TIR_ERIvaluesignsymbolnonesignsymbolvaluenone

以下がプログラムです。相変わらず汚いですが。

#include <iostream>
#include <locale>
#include <vector>
#include <string>
#include <array>
#include <codecvt>
#include <utility>
#include <tuple>
#include <windows.h>
#include <boost/range/algorithm.hpp>
 
using namespace std;
 
void PutPart(ostream& os, int p)
{
  switch (p)
  {
    case money_base::none: os << "none"; break;
    case money_base::space: os << "space"; break;
    case money_base::symbol: os << "symbol"; break;
    case money_base::sign: os << "sign"; break;
    case money_base::value: os << "value"; break;
  }
}
 
int main()
{
  typedef pair<wstring, wstring> CountryAndLanguage;
  vector<CountryAndLanguage> locs;
  ::EnumSystemLocalesEx([](LPWSTR localeName, DWORD /*flags*/, LPARAM lParam) {
    array<WCHAR, 4> language;
    ::GetLocaleInfoEx(localeName, LOCALE_SABBREVLANGNAME, language.data(), language.size());
    array<WCHAR, 4> country;
    ::GetLocaleInfoEx(localeName, LOCALE_SABBREVCTRYNAME, country.data(), country.size());
 
    reinterpret_cast<vector<CountryAndLanguage>*>(lParam)->push_back({country.data(), language.data()});
    return TRUE;
  }, LOCALE_NEUTRALDATA, reinterpret_cast<LPARAM>(&locs), nullptr);
  sort(locs.begin(), locs.end());
 
  typedef tuple<array<char, 8>, string> MoneyPattern;
  vector<MoneyPattern> moneyPatterns;
  for (auto const& countryAndLang : locs)
  {
    wstring locW = countryAndLang.second + L'_' + countryAndLang.first;
    string loc(locW.begin(), locW.end());
 
    locale l(loc);
    auto const& m = use_facet<moneypunct<char>>(l);
 
    array<char, 8> format;
    auto it = boost::copy(m.pos_format().field, format.begin());
    boost::copy(m.neg_format().field, it);
 
    moneyPatterns.emplace_back(format, loc);
  }
  boost::sort(moneyPatterns);
  for (const auto& pattern : moneyPatterns)
  {
    cout << std::get<1>(pattern);
    for (int p : std::get<0>(pattern))
    {
      cout << '\t';
      PutPart(cout, p);
    }
    cout << '\n';
  }
}
スポンサード リンク

この記事のカテゴリ

  • ⇒ Visual C++の金額書式情報・完全版 その2
  • ⇒ Visual C++の金額書式情報・完全版 その2
  • ⇒ Visual C++の金額書式情報・完全版 その2
  • ⇒ Visual C++の金額書式情報・完全版 その2