Получить валютный код ISO 4217 на основе локали
Скажем, если я анализирую заголовок HTTP Accept-Language с Locale::acceptFromHttp
Существует ли простой и надежный способ получения предпочтительной валюты пользователя на основе этого идентификатора локали? Как "USD" для "en-US".
Я хотел бы, чтобы был способ сделать это с расширением PHP intl, но до сих пор не смог найти мой ответ в руководстве. Я видел, что Zend Framework может сделать это с Zend_Currency, но он слишком раздут для моего конкретного программного обеспечения.
Любые другие библиотеки или способы достижения этого? Так как должно быть много идентификаторов локали, просто switch
немного излишества.
2 ответа
Вы можете сделать это как в PHP 4, так и в PHP 5, используя setlocale()
а также localeconv()
:
$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
setlocale(LC_MONETARY, $locale);
print_r(localeconv());
Образец вывода:
Array
(
[decimal_point] => .
[thousands_sep] =>
[int_curr_symbol] => EUR
[currency_symbol] => €
[mon_decimal_point] => ,
[mon_thousands_sep] =>
[positive_sign] =>
[negative_sign] => -
[int_frac_digits] => 2
[frac_digits] => 2
[p_cs_precedes] => 1
[p_sep_by_space] => 1
[n_cs_precedes] => 1
[n_sep_by_space] => 1
[p_sign_posn] => 1
[n_sign_posn] => 2
[grouping] => Array
(
)
[mon_grouping] => Array
(
[0] => 3
[1] => 3
)
)
Код ISO 4217 содержится в результирующем массиве int_curr_symbol
ключ.
Немного поздно, но вы можете получить это с \NumberFormatter
:
<?php
$currencyPerLocale = array_reduce(
\ResourceBundle::getLocales(''),
function (array $currencies, string $locale) {
$currencies[$locale] = \NumberFormatter::create(
$locale,
\NumberFormatter::CURRENCY
)->getTextAttribute(\NumberFormatter::CURRENCY_CODE);
return $currencies;
},
[]
);