前回の結果(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)); } } |
スポンサード リンク |
この記事のカテゴリ
- C++ ⇒ Visual C++の金額書式情報・完全版
- VC++ ⇒ Visual C++の金額書式情報・完全版
- Windows ⇒ Vista ⇒ Visual C++の金額書式情報・完全版
- Windows ⇒ WinAPI ⇒ Visual C++の金額書式情報・完全版