Получить валютный код 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;
    },
    []
);
Другие вопросы по тегам