前回の結果(Visual C++の金額書式情報)、明らかにおかしい、少なすぎると思っていました。Windowsが持っているデータはこんなに少ないわけがないのです。Microsoft、Windows 8での表示言語追加を簡易化 – ITmedia ニュースによれば、Windows 8では109もの言語に対応しているそうです。

なので、Visual C++のロケールについて調べ直しました。Visual C++のソースを追ってみたところ、Windows APIのNLS関連の関数と突き合わせていることが分かりました。

それを踏まえ、今回はEnumSystemLocalesExが返したすべてに対する結果を出力しました。つまり、ユーロを使っている諸国もすべて載せています。また、同じ国に対して複数の言語が対応する場合も載せています。全部で154件ありました。

PAS_AFG؋12٬345٫67؋12٬345٫67-AFN12٬345٫67AFN-12٬345٫67
PRS_AFG؋12,345.67؋12,345.67-AFN12,345.67AFN-12,345.67
SQI_ALB+12.345,67 Lek-12.345,67 LekALL+12.345,67ALL-12.345,67
HYE_ARM12,345.67 ֏-12,345.67 ֏AMD12,345.67AMD-12,345.67
AZC_AZE12 345,67 ман.-12 345,67 ман.AZN12 345,67AZN-12 345,67
AZE_AZE12 345,67 manat-12 345,67 manatAZN12 345,67AZN-12 345,67
AZE_AZE12 345,67 manat-12 345,67 manatAZN12 345,67AZN-12 345,67
BGR_BGR12 345,67 лв.-12 345,67 лв.BGN12 345,67BGN-12 345,67
BSB_BIH+12.345,67 KM-12.345,67 KMBAM+12.345,67BAM-12.345,67
BSB_BIH+12.345,67 KM-12.345,67 KMBAM+12.345,67BAM-12.345,67
BSC_BIH12.345,67 КМ-12.345,67 КМBAM12.345,67BAM-12.345,67
BEL_BLR12 345,67 р.-12 345,67 р.BYR12 345,67BYR-12 345,67
QUB_BOL$b 12.345,67-$b 12.345,67BOB12.345,67BOB-12.345,67
PTB_BRAR$ 12.345,67-R$ 12.345,67BRL12.345,67BRL-12.345,67
IUK_CAN+$12,345.67-$12,345.67CAD+12,345.67CAD-12,345.67
IUK_CAN+$12,345.67-$12,345.67CAD+12,345.67CAD-12,345.67
IUS_CAN$12,345.67-$12,345.67CAD12,345.67CAD-12,345.67
MWK_CAN$12,345.67-$12,345.67CAD12,345.67CAD-12,345.67
RMC_CHEfr. 12’345.67fr.-12’345.67CHF12’345.67CHF-12’345.67
MPD_CHL$ 12.345,67-$ 12.345,67CLP12.345,67CLP-12.345,67
BOB_CHN¥12,345.67¥-12,345.67CNY12,345.67CNY-12,345.67
CHS_CHN¥12,345.67¥-12,345.67CNY12,345.67CNY-12,345.67
CHS_CHN¥12,345.67¥-12,345.67CNY12,345.67CNY-12,345.67
III_CHN¥12,345.67¥-12,345.67CNY12,345.67CNY-12,345.67
MNG_CHN¥12,345.67¥-12,345.67CNY12,345.67CNY-12,345.67
UIG_CHN¥12,345.67¥-12,345.67CNY12,345.67CNY-12,345.67
CSY_CZE12 345,67 Kč-12 345,67 KčCZK12 345,67CZK-12 345,67
DEU_DEU12.345,67 €-12.345,67 €EUR12.345,67EUR-12.345,67
DAN_DNKkr. 12.345,67kr.- 12.345,67DKK12.345,67DKK-12.345,67
TZM_DZA12 345,67 DZD-12 345,67 DZDDZD12 345,67DZD-12 345,67
TZM_DZA12 345,67 DZD-12 345,67 DZDDZD12 345,67DZD-12 345,67
TIR_ERI12,345.67+ERN-ERN12,345.67ERN+12,345.67ERN-12,345.67
CAT_ESP12.345,67 €-12.345,67 €EUR12.345,67EUR-12.345,67
ESP_ESP12.345,67 €-12.345,67 €EUR12.345,67EUR-12.345,67
EUQ_ESP12.345,67 €-12.345,67 €EUR12.345,67EUR-12.345,67
GLC_ESP12.345,67 €-12.345,67 €EUR12.345,67EUR-12.345,67
ETI_EST12 345.67 €-12 345.67 €EUR12 345.67EUR-12 345.67
AMH_ETH+ETB12,345.67-ETB12,345.67ETB+12,345.67ETB-12,345.67
FIN_FIN12 345,67 €-12 345,67 €EUR12 345,67EUR-12 345,67
SMN_FIN12 345,67 €-12 345,67 €EUR12 345,67EUR-12 345,67
SMS_FIN12 345,67 €-12 345,67 €EUR12 345,67EUR-12 345,67
BRE_FRA12 345,67 €-12 345,67 €EUR12 345,67EUR-12 345,67
COS_FRA12 345,67 €-12 345,67 €EUR12 345,67EUR-12 345,67
FRA_FRA12 345,67 €-12 345,67 €EUR12 345,67EUR-12 345,67
GSW_FRA12 345,67 €-12 345,67 €EUR12 345,67EUR-12 345,67
OCI_FRA12 345,67 €-12 345,67 €EUR12 345,67EUR-12 345,67
FOS_FROkr. 12.345,67kr.- 12.345,67DKK12.345,67DKK-12.345,67
CYM_GBR£12,345.67-£12,345.67GBP12,345.67GBP-12,345.67
GLA_GBR£12,345.67-£12,345.67GBP12,345.67GBP-12,345.67
KAT_GEO12 345,67 ლ.-12 345,67 ლ.GEL12 345,67GEL-12 345,67
DSB_GER+12.345,67 €-12.345,67 €EUR+12.345,67EUR-12.345,67
HSB_GER+12.345,67 €-12.345,67 €EUR+12.345,67EUR-12.345,67
ELL_GRC+12.345,67 €-12.345,67 €EUR+12.345,67EUR-12.345,67
KAL_GRLkr. 12.345,67kr.- 12.345,67DKK12.345,67DKK-12.345,67
QUT_GTMQ12,345.67-Q12,345.67GTQ12,345.67GTQ-12,345.67
CHT_HKGHK$12,345.67-HK$12,345.67HKD12,345.67HKD-12,345.67
HRV_HRV12.345,67 kn-12.345,67 knHRK12.345,67HRK-12.345,67
HUN_HUN12 345,67 Ft-12 345,67 FtHUF12 345,67HUF-12 345,67
IND_IDNRp1.234.567-Rp1.234.567IDR1.234.567IDR-1.234.567
ASM_IND₹+ 12,345.67₹- 12,345.67INR+12,345.67INR-12,345.67
BNG_IND₹ 12,345.67₹- 12,345.67INR12,345.67INR-12,345.67
GUJ_IND₹ 12,345.67₹- 12,345.67INR12,345.67INR-12,345.67
HIN_IND₹ 12,345.67₹- 12,345.67INR12,345.67INR-12,345.67
KDI_IND₹ 12,345.67₹- 12,345.67INR12,345.67INR-12,345.67
KNK_IND₹ 12,345.67₹- 12,345.67INR12,345.67INR-12,345.67
MAR_IND₹ 12,345`67₹- 12,345`67INR12,345`67INR-12,345`67
MYM_IND₹ 12,345.67₹- 12,345.67INR12,345.67INR-12,345.67
ORI_IND₹ 12,345.67₹- 12,345.67INR12,345.67INR-12,345.67
PAN_IND₹ 12,345.67₹- 12,345.67INR12,345.67INR-12,345.67
SAN_IND₹ 12,345.67₹- 12,345.67INR12,345.67INR-12,345.67
TAM_IND₹ 12,345.67₹- 12,345.67INR12,345.67INR-12,345.67
TEL_IND₹ 12,345.67₹- 12,345.67INR12,345.67INR-12,345.67
IRE_IRL€12,345.67-€12,345.67EUR12,345.67EUR-12,345.67
FAR_IRNريال12،345/67ريال12،345/67-IRR12،345/67IRR-12،345/67
KUR_IRQد.ع.‏12،345.67د.ع.‏-12،345.67IQD12،345.67IQD-12،345.67
KUR_IRQد.ع.‏12،345.67د.ع.‏-12،345.67IQD12،345.67IQD-12،345.67
ISL_ISL1.234.567 kr.-1.234.567 kr.ISK1.234.567ISK-1.234.567
HEB_ISR₪ 12,345.67₪-12,345.67ILS12,345.67ILS-12,345.67
ITA_ITA€ 12.345,67-€ 12.345,67EUR12.345,67EUR-12.345,67
IVL_IVC+¤12,345.67-¤12,345.67XDR+12,345.67XDR-12,345.67
JPN_JPN¥1,234,567-¥1,234,567JPY1,234,567JPY-1,234,567
KKZ_KAZ₸12 345-67-₸12 345-67KZT12 345-67KZT-12 345-67
SWK_KENS12,345.67-S12,345.67KES12,345.67KES-12,345.67
KYR_KGZ12 345,67 сом-12 345,67 сомKGS12 345,67KGS-12 345,67
KHM_KHM+12,345.67៛-12,345.67៛KHR+12,345.67KHR-12,345.67
KOR_KOR₩1,234,567-₩1,234,567KRW1,234,567KRW-1,234,567
LAO_LAO+12,345.67 ₭-12,345.67 ₭LAK+12,345.67LAK-12,345.67
SIN_LKA+රු. 12,345.67-රු. 12,345.67LKR+12,345.67LKR-12,345.67
LTH_LTU12 345,67 Lt-12 345,67 LtLTL12 345,67LTL-12 345,67
LBX_LUX12 345,67 €-12 345,67 €EUR12 345,67EUR-12 345,67
LVI_LVALs 12 345,67-Ls 12 345,67LVL12 345,67LVL-12 345,67
TZM_MAR12 345,67 ⴷⵔ-12 345,67 ⴷⵔMAD12 345,67MAD-12 345,67
DIV_MDV12,345.67 ރ.12,345.67 ރ.-MVR12,345.67MVR-12,345.67
MKI_MKD+12.345,67 ден.-12.345,67 ден.MKD+12.345,67MKD-12.345,67
MLT_MLT+€12,345.67-€12,345.67EUR+12,345.67EUR-12,345.67
MNN_MNG12 345,67 ₮-12 345,67 ₮MNT12 345,67MNT-12 345,67
MON_MNG12 345,67 ₮-12 345,67 ₮MNT12 345,67MNT-12 345,67
MSL_MYSRM1,234,567-RM1,234,567MYR1,234,567MYR-1,234,567
NEP_NEPरु12,345.67-रु12,345.67NPR12,345.67NPR-12,345.67
HAU_NGA₦ 12,345.67₦-12,345.67NGN12,345.67NGN-12,345.67
HAU_NGA₦ 12,345.67₦-12,345.67NGN12,345.67NGN-12,345.67
IBO_NGA₦ 12,345.67₦-12,345.67NGN12,345.67NGN-12,345.67
YOR_NGA₦ 12,345.67-₦ 12,345.67NGN12,345.67NGN-12,345.67
FYN_NLD€ 12.345,67€- 12.345,67EUR12.345,67EUR-12.345,67
NLD_NLD€ 12.345,67€- 12.345,67EUR12.345,67EUR-12.345,67
NON_NORkr 12 345,67kr- 12 345,67NOK12 345,67NOK-12 345,67
NOR_NORkr 12 345,67kr- 12 345,67NOK12 345,67NOK-12 345,67
NOR_NORkr 12 345,67kr- 12 345,67NOK12 345,67NOK-12 345,67
SME_NORkr 12 345,67kr- 12 345,67NOK12 345,67NOK-12 345,67
MRI_NZL$12,345.67-$12,345.67NZD12,345.67NZD-12,345.67
PAN_PAK+Rs 12,345.67-Rs 12,345.67PKR+12,345.67PKR-12,345.67
SIN_PAK+Rs 12,345.67-Rs 12,345.67PKR+12,345.67PKR-12,345.67
SIN_PAK+Rs 12,345.67-Rs 12,345.67PKR+12,345.67PKR-12,345.67
URD_PAKRs12,345.67Rs12,345.67-PKR12,345.67PKR-12,345.67
FPO_PHLPhP12,345.67-PhP12,345.67PHP12,345.67PHP-12,345.67
PLK_POL12 345,67 zł-12 345,67 złPLN12 345,67PLN-12 345,67
ROM_ROM12.345,67 RON-12.345,67 RONRON12.345,67RON-12.345,67
BAS_RUS12 345,67 һ.-12 345,67 һ.RUB12 345,67RUB-12 345,67
RUS_RUS12 345,67 р.-12 345,67 р.RUB12 345,67RUB-12 345,67
SAH_RUS12 345,67с.-12 345,67с.RUB12 345,67RUB-12 345,67
TTT_RUS12 345,67 р.-12 345,67 р.RUB12 345,67RUB-12 345,67
KIN_RWA12 345,67 RWF-12 345,67 RWFRWF12 345,67RWF-12 345,67
ARA_SAUر.س.‏ 12,345.67ر.س.‏12,345.67-SAR12,345.67SAR-12,345.67
FUL_SEN12 345,67 XOF-12 345,67 XOFXOF12 345,67XOF-12 345,67
FUL_SEN12 345,67 XOF-12 345,67 XOFXOF12 345,67XOF-12 345,67
WOL_SEN12 345,67 XOF-12 345,67 XOFXOF12 345,67XOF-12 345,67
SRB_SRB12.345,67 din.-12.345,67 din.RSD12.345,67RSD-12.345,67
SRM_SRB12.345,67 din.-12.345,67 din.RSD12.345,67RSD-12.345,67
SRO_SRB12.345,67 дин.-12.345,67 дин.RSD12.345,67RSD-12.345,67
SKY_SVK12 345,67 EUR-12 345,67 EUREUR12 345,67EUR-12 345,67
SLV_SVN12.345,67 €-12.345,67 €EUR12.345,67EUR-12.345,67
SMB_SWE12.345,67 kr-12.345,67 krSEK12.345,67SEK-12.345,67
SMK_SWE12.345,67 kr-12.345,67 krSEK12.345,67SEK-12.345,67
SVE_SWE12.345,67 kr-12.345,67 krSEK12.345,67SEK-12.345,67
SYR_SYR+12,345.67 ܠ.ܣ.‏-12,345.67 ܠ.ܣ.‏SYP+12,345.67SYP-12,345.67
TAJ_TAJ12 345,67 смн-12 345,67 смнTJS12 345,67TJS-12 345,67
TAJ_TAJ12 345,67 смн-12 345,67 смнTJS12 345,67TJS-12 345,67
THA_THA฿12,345.67-฿12,345.67THB12,345.67THB-12,345.67
TUK_TKM12 345,67m.-12 345,67m.TMT12 345,67TMT-12 345,67
TRK_TUR12.345,67 ₺-12.345,67 ₺TRY12.345,67TRY-12.345,67
UKR_UKR12 345,67₴-12 345,67₴UAH12 345,67UAH-12 345,67
CRE_USA+$12,345.67-$12,345.67USD+12,345.67USD-12,345.67
CRE_USA+$12,345.67-$12,345.67USD+12,345.67USD-12,345.67
ENU_USA$12,345.67-$12,345.67USD12,345.67USD-12,345.67
HAW_USA$12,345.67-$12,345.67USD12,345.67USD-12,345.67
UZB_UZB12 345,67 so’m-12 345,67 so’mUZS12 345,67UZS-12 345,67
UZB_UZB12 345,67 so’m-12 345,67 so’mUZS12 345,67UZS-12 345,67
UZB_UZB12 345,67 so’m-12 345,67 so’mUZS12 345,67UZS-12 345,67
VIT_VNM12.345,67 ₫-12.345,67 ₫VND12.345,67VND-12.345,67
AFK_ZAFR+ 12 345,67R-12 345,67ZAR+12 345,67ZAR-12 345,67
NSO_ZAFR+ 12,345.67R-12,345.67ZAR+12,345.67ZAR-12,345.67
TSN_ZAFR+ 12,345.67R-12,345.67ZAR+12,345.67ZAR-12,345.67
XHO_ZAFR+ 12,345.67R-12,345.67ZAR+12,345.67ZAR-12,345.67
ZUL_ZAFR+ 12,345.67R-12,345.67ZAR+12,345.67ZAR-12,345.67

そして、今回のソースコードです。locsをvectorにして、EnumSystemLocalesExから内容を求めていく部分が主な変更点です。for以降の出力する部分はcodecvt_utf8_utf16を使うように変えてみました、前回と同じようにしても良かったのですが。あと、November 2012 CTPを使っています。push_backのところがアレです。

#include <iostream>
#include <iomanip>
#include <locale>
#include <fstream>
#include <vector>
#include <string>
#include <array>
#include <codecvt>
#include <utility>
#include <windows.h>
 
using namespace std;
 
void f(wostream& s, locale const& l)
{
  s.imbue(l);
  s << showbase;
  s << put_money(L"1234567.89123", false) << '\t';
  s << put_money(L"-1234567.89123", false) << '\t';
  s << put_money(L"1234567.89123", true) << '\t';
  s << put_money(L"-1234567.89123", true) << '\n';
}
 
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());
 
  wofstream os("loc-vc.txt");
  os.imbue(locale(locale::classic(), new codecvt_utf8_utf16<WCHAR>()));
 
  for (auto countryAndLang : locs)
  {
    wstring locW = countryAndLang.second + L'_' + countryAndLang.first;
    os << locW.c_str() << '\t';
    // 注意:この変換処理はまったく汎用性がない
    string loc(locW.begin(), locW.end());
    f(os, locale(os.getloc(), loc, locale::monetary));
  }
}
スポンサード リンク

この記事のカテゴリ

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