前回の結果(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٫67 AFN-12٬345٫67
PRS_AFG ؋12,345.67 ؋12,345.67- AFN12,345.67 AFN-12,345.67
SQI_ALB +12.345,67 Lek -12.345,67 Lek ALL+12.345,67 ALL-12.345,67
HYE_ARM 12,345.67 ֏ -12,345.67 ֏ AMD12,345.67 AMD-12,345.67
AZC_AZE 12 345,67 ман. -12 345,67 ман. AZN12 345,67 AZN-12 345,67
AZE_AZE 12 345,67 manat -12 345,67 manat AZN12 345,67 AZN-12 345,67
AZE_AZE 12 345,67 manat -12 345,67 manat AZN12 345,67 AZN-12 345,67
BGR_BGR 12 345,67 лв. -12 345,67 лв. BGN12 345,67 BGN-12 345,67
BSB_BIH +12.345,67 KM -12.345,67 KM BAM+12.345,67 BAM-12.345,67
BSB_BIH +12.345,67 KM -12.345,67 KM BAM+12.345,67 BAM-12.345,67
BSC_BIH 12.345,67 КМ -12.345,67 КМ BAM12.345,67 BAM-12.345,67
BEL_BLR 12 345,67 р. -12 345,67 р. BYR12 345,67 BYR-12 345,67
QUB_BOL $b 12.345,67 -$b 12.345,67 BOB12.345,67 BOB-12.345,67
PTB_BRA R$ 12.345,67 -R$ 12.345,67 BRL12.345,67 BRL-12.345,67
IUK_CAN +$12,345.67 -$12,345.67 CAD+12,345.67 CAD-12,345.67
IUK_CAN +$12,345.67 -$12,345.67 CAD+12,345.67 CAD-12,345.67
IUS_CAN $12,345.67 -$12,345.67 CAD12,345.67 CAD-12,345.67
MWK_CAN $12,345.67 -$12,345.67 CAD12,345.67 CAD-12,345.67
RMC_CHE fr. 12’345.67 fr.-12’345.67 CHF12’345.67 CHF-12’345.67
MPD_CHL $ 12.345,67 -$ 12.345,67 CLP12.345,67 CLP-12.345,67
BOB_CHN ¥12,345.67 ¥-12,345.67 CNY12,345.67 CNY-12,345.67
CHS_CHN ¥12,345.67 ¥-12,345.67 CNY12,345.67 CNY-12,345.67
CHS_CHN ¥12,345.67 ¥-12,345.67 CNY12,345.67 CNY-12,345.67
III_CHN ¥12,345.67 ¥-12,345.67 CNY12,345.67 CNY-12,345.67
MNG_CHN ¥12,345.67 ¥-12,345.67 CNY12,345.67 CNY-12,345.67
UIG_CHN ¥12,345.67 ¥-12,345.67 CNY12,345.67 CNY-12,345.67
CSY_CZE 12 345,67 Kč -12 345,67 Kč CZK12 345,67 CZK-12 345,67
DEU_DEU 12.345,67 € -12.345,67 € EUR12.345,67 EUR-12.345,67
DAN_DNK kr. 12.345,67 kr.- 12.345,67 DKK12.345,67 DKK-12.345,67
TZM_DZA 12 345,67 DZD -12 345,67 DZD DZD12 345,67 DZD-12 345,67
TZM_DZA 12 345,67 DZD -12 345,67 DZD DZD12 345,67 DZD-12 345,67
TIR_ERI 12,345.67+ERN -ERN12,345.67 ERN+12,345.67 ERN-12,345.67
CAT_ESP 12.345,67 € -12.345,67 € EUR12.345,67 EUR-12.345,67
ESP_ESP 12.345,67 € -12.345,67 € EUR12.345,67 EUR-12.345,67
EUQ_ESP 12.345,67 € -12.345,67 € EUR12.345,67 EUR-12.345,67
GLC_ESP 12.345,67 € -12.345,67 € EUR12.345,67 EUR-12.345,67
ETI_EST 12 345.67 € -12 345.67 € EUR12 345.67 EUR-12 345.67
AMH_ETH +ETB12,345.67 -ETB12,345.67 ETB+12,345.67 ETB-12,345.67
FIN_FIN 12 345,67 € -12 345,67 € EUR12 345,67 EUR-12 345,67
SMN_FIN 12 345,67 € -12 345,67 € EUR12 345,67 EUR-12 345,67
SMS_FIN 12 345,67 € -12 345,67 € EUR12 345,67 EUR-12 345,67
BRE_FRA 12 345,67 € -12 345,67 € EUR12 345,67 EUR-12 345,67
COS_FRA 12 345,67 € -12 345,67 € EUR12 345,67 EUR-12 345,67
FRA_FRA 12 345,67 € -12 345,67 € EUR12 345,67 EUR-12 345,67
GSW_FRA 12 345,67 € -12 345,67 € EUR12 345,67 EUR-12 345,67
OCI_FRA 12 345,67 € -12 345,67 € EUR12 345,67 EUR-12 345,67
FOS_FRO kr. 12.345,67 kr.- 12.345,67 DKK12.345,67 DKK-12.345,67
CYM_GBR £12,345.67 -£12,345.67 GBP12,345.67 GBP-12,345.67
GLA_GBR £12,345.67 -£12,345.67 GBP12,345.67 GBP-12,345.67
KAT_GEO 12 345,67 ლ. -12 345,67 ლ. GEL12 345,67 GEL-12 345,67
DSB_GER +12.345,67 € -12.345,67 € EUR+12.345,67 EUR-12.345,67
HSB_GER +12.345,67 € -12.345,67 € EUR+12.345,67 EUR-12.345,67
ELL_GRC +12.345,67 € -12.345,67 € EUR+12.345,67 EUR-12.345,67
KAL_GRL kr. 12.345,67 kr.- 12.345,67 DKK12.345,67 DKK-12.345,67
QUT_GTM Q12,345.67 -Q12,345.67 GTQ12,345.67 GTQ-12,345.67
CHT_HKG HK$12,345.67 -HK$12,345.67 HKD12,345.67 HKD-12,345.67
HRV_HRV 12.345,67 kn -12.345,67 kn HRK12.345,67 HRK-12.345,67
HUN_HUN 12 345,67 Ft -12 345,67 Ft HUF12 345,67 HUF-12 345,67
IND_IDN Rp1.234.567 -Rp1.234.567 IDR1.234.567 IDR-1.234.567
ASM_IND ₹+ 12,345.67 ₹- 12,345.67 INR+12,345.67 INR-12,345.67
BNG_IND ₹ 12,345.67 ₹- 12,345.67 INR12,345.67 INR-12,345.67
GUJ_IND ₹ 12,345.67 ₹- 12,345.67 INR12,345.67 INR-12,345.67
HIN_IND ₹ 12,345.67 ₹- 12,345.67 INR12,345.67 INR-12,345.67
KDI_IND ₹ 12,345.67 ₹- 12,345.67 INR12,345.67 INR-12,345.67
KNK_IND ₹ 12,345.67 ₹- 12,345.67 INR12,345.67 INR-12,345.67
MAR_IND ₹ 12,345`67 ₹- 12,345`67 INR12,345`67 INR-12,345`67
MYM_IND ₹ 12,345.67 ₹- 12,345.67 INR12,345.67 INR-12,345.67
ORI_IND ₹ 12,345.67 ₹- 12,345.67 INR12,345.67 INR-12,345.67
PAN_IND ₹ 12,345.67 ₹- 12,345.67 INR12,345.67 INR-12,345.67
SAN_IND ₹ 12,345.67 ₹- 12,345.67 INR12,345.67 INR-12,345.67
TAM_IND ₹ 12,345.67 ₹- 12,345.67 INR12,345.67 INR-12,345.67
TEL_IND ₹ 12,345.67 ₹- 12,345.67 INR12,345.67 INR-12,345.67
IRE_IRL €12,345.67 -€12,345.67 EUR12,345.67 EUR-12,345.67
FAR_IRN ريال12،345/67 ريال12،345/67- IRR12،345/67 IRR-12،345/67
KUR_IRQ د.ع.‏12،345.67 د.ع.‏-12،345.67 IQD12،345.67 IQD-12،345.67
KUR_IRQ د.ع.‏12،345.67 د.ع.‏-12،345.67 IQD12،345.67 IQD-12،345.67
ISL_ISL 1.234.567 kr. -1.234.567 kr. ISK1.234.567 ISK-1.234.567
HEB_ISR ₪ 12,345.67 ₪-12,345.67 ILS12,345.67 ILS-12,345.67
ITA_ITA € 12.345,67 -€ 12.345,67 EUR12.345,67 EUR-12.345,67
IVL_IVC +¤12,345.67 -¤12,345.67 XDR+12,345.67 XDR-12,345.67
JPN_JPN ¥1,234,567 -¥1,234,567 JPY1,234,567 JPY-1,234,567
KKZ_KAZ ₸12 345-67 -₸12 345-67 KZT12 345-67 KZT-12 345-67
SWK_KEN S12,345.67 -S12,345.67 KES12,345.67 KES-12,345.67
KYR_KGZ 12 345,67 сом -12 345,67 сом KGS12 345,67 KGS-12 345,67
KHM_KHM +12,345.67៛ -12,345.67៛ KHR+12,345.67 KHR-12,345.67
KOR_KOR ₩1,234,567 -₩1,234,567 KRW1,234,567 KRW-1,234,567
LAO_LAO +12,345.67 ₭ -12,345.67 ₭ LAK+12,345.67 LAK-12,345.67
SIN_LKA +රු. 12,345.67 -රු. 12,345.67 LKR+12,345.67 LKR-12,345.67
LTH_LTU 12 345,67 Lt -12 345,67 Lt LTL12 345,67 LTL-12 345,67
LBX_LUX 12 345,67 € -12 345,67 € EUR12 345,67 EUR-12 345,67
LVI_LVA Ls 12 345,67 -Ls 12 345,67 LVL12 345,67 LVL-12 345,67
TZM_MAR 12 345,67 ⴷⵔ -12 345,67 ⴷⵔ MAD12 345,67 MAD-12 345,67
DIV_MDV 12,345.67 ރ. 12,345.67 ރ.- MVR12,345.67 MVR-12,345.67
MKI_MKD +12.345,67 ден. -12.345,67 ден. MKD+12.345,67 MKD-12.345,67
MLT_MLT +€12,345.67 -€12,345.67 EUR+12,345.67 EUR-12,345.67
MNN_MNG 12 345,67 ₮ -12 345,67 ₮ MNT12 345,67 MNT-12 345,67
MON_MNG 12 345,67 ₮ -12 345,67 ₮ MNT12 345,67 MNT-12 345,67
MSL_MYS RM1,234,567 -RM1,234,567 MYR1,234,567 MYR-1,234,567
NEP_NEP रु12,345.67 -रु12,345.67 NPR12,345.67 NPR-12,345.67
HAU_NGA ₦ 12,345.67 ₦-12,345.67 NGN12,345.67 NGN-12,345.67
HAU_NGA ₦ 12,345.67 ₦-12,345.67 NGN12,345.67 NGN-12,345.67
IBO_NGA ₦ 12,345.67 ₦-12,345.67 NGN12,345.67 NGN-12,345.67
YOR_NGA ₦ 12,345.67 -₦ 12,345.67 NGN12,345.67 NGN-12,345.67
FYN_NLD € 12.345,67 €- 12.345,67 EUR12.345,67 EUR-12.345,67
NLD_NLD € 12.345,67 €- 12.345,67 EUR12.345,67 EUR-12.345,67
NON_NOR kr 12 345,67 kr- 12 345,67 NOK12 345,67 NOK-12 345,67
NOR_NOR kr 12 345,67 kr- 12 345,67 NOK12 345,67 NOK-12 345,67
NOR_NOR kr 12 345,67 kr- 12 345,67 NOK12 345,67 NOK-12 345,67
SME_NOR kr 12 345,67 kr- 12 345,67 NOK12 345,67 NOK-12 345,67
MRI_NZL $12,345.67 -$12,345.67 NZD12,345.67 NZD-12,345.67
PAN_PAK +Rs 12,345.67 -Rs 12,345.67 PKR+12,345.67 PKR-12,345.67
SIN_PAK +Rs 12,345.67 -Rs 12,345.67 PKR+12,345.67 PKR-12,345.67
SIN_PAK +Rs 12,345.67 -Rs 12,345.67 PKR+12,345.67 PKR-12,345.67
URD_PAK Rs12,345.67 Rs12,345.67- PKR12,345.67 PKR-12,345.67
FPO_PHL PhP12,345.67 -PhP12,345.67 PHP12,345.67 PHP-12,345.67
PLK_POL 12 345,67 zł -12 345,67 zł PLN12 345,67 PLN-12 345,67
ROM_ROM 12.345,67 RON -12.345,67 RON RON12.345,67 RON-12.345,67
BAS_RUS 12 345,67 һ. -12 345,67 һ. RUB12 345,67 RUB-12 345,67
RUS_RUS 12 345,67 р. -12 345,67 р. RUB12 345,67 RUB-12 345,67
SAH_RUS 12 345,67с. -12 345,67с. RUB12 345,67 RUB-12 345,67
TTT_RUS 12 345,67 р. -12 345,67 р. RUB12 345,67 RUB-12 345,67
KIN_RWA 12 345,67 RWF -12 345,67 RWF RWF12 345,67 RWF-12 345,67
ARA_SAU ر.س.‏ 12,345.67 ر.س.‏12,345.67- SAR12,345.67 SAR-12,345.67
FUL_SEN 12 345,67 XOF -12 345,67 XOF XOF12 345,67 XOF-12 345,67
FUL_SEN 12 345,67 XOF -12 345,67 XOF XOF12 345,67 XOF-12 345,67
WOL_SEN 12 345,67 XOF -12 345,67 XOF XOF12 345,67 XOF-12 345,67
SRB_SRB 12.345,67 din. -12.345,67 din. RSD12.345,67 RSD-12.345,67
SRM_SRB 12.345,67 din. -12.345,67 din. RSD12.345,67 RSD-12.345,67
SRO_SRB 12.345,67 дин. -12.345,67 дин. RSD12.345,67 RSD-12.345,67
SKY_SVK 12 345,67 EUR -12 345,67 EUR EUR12 345,67 EUR-12 345,67
SLV_SVN 12.345,67 € -12.345,67 € EUR12.345,67 EUR-12.345,67
SMB_SWE 12.345,67 kr -12.345,67 kr SEK12.345,67 SEK-12.345,67
SMK_SWE 12.345,67 kr -12.345,67 kr SEK12.345,67 SEK-12.345,67
SVE_SWE 12.345,67 kr -12.345,67 kr SEK12.345,67 SEK-12.345,67
SYR_SYR +12,345.67 ܠ.ܣ.‏ -12,345.67 ܠ.ܣ.‏ SYP+12,345.67 SYP-12,345.67
TAJ_TAJ 12 345,67 смн -12 345,67 смн TJS12 345,67 TJS-12 345,67
TAJ_TAJ 12 345,67 смн -12 345,67 смн TJS12 345,67 TJS-12 345,67
THA_THA ฿12,345.67 -฿12,345.67 THB12,345.67 THB-12,345.67
TUK_TKM 12 345,67m. -12 345,67m. TMT12 345,67 TMT-12 345,67
TRK_TUR 12.345,67 ₺ -12.345,67 ₺ TRY12.345,67 TRY-12.345,67
UKR_UKR 12 345,67₴ -12 345,67₴ UAH12 345,67 UAH-12 345,67
CRE_USA +$12,345.67 -$12,345.67 USD+12,345.67 USD-12,345.67
CRE_USA +$12,345.67 -$12,345.67 USD+12,345.67 USD-12,345.67
ENU_USA $12,345.67 -$12,345.67 USD12,345.67 USD-12,345.67
HAW_USA $12,345.67 -$12,345.67 USD12,345.67 USD-12,345.67
UZB_UZB 12 345,67 so’m -12 345,67 so’m UZS12 345,67 UZS-12 345,67
UZB_UZB 12 345,67 so’m -12 345,67 so’m UZS12 345,67 UZS-12 345,67
UZB_UZB 12 345,67 so’m -12 345,67 so’m UZS12 345,67 UZS-12 345,67
VIT_VNM 12.345,67 ₫ -12.345,67 ₫ VND12.345,67 VND-12.345,67
AFK_ZAF R+ 12 345,67 R-12 345,67 ZAR+12 345,67 ZAR-12 345,67
NSO_ZAF R+ 12,345.67 R-12,345.67 ZAR+12,345.67 ZAR-12,345.67
TSN_ZAF R+ 12,345.67 R-12,345.67 ZAR+12,345.67 ZAR-12,345.67
XHO_ZAF R+ 12,345.67 R-12,345.67 ZAR+12,345.67 ZAR-12,345.67
ZUL_ZAF R+ 12,345.67 R-12,345.67 ZAR+12,345.67 ZAR-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++の金額書式情報・完全版