根据区域设置获取货币ISO 4217代码

时间:2010-11-28 21:09:55

标签: php intl

比方说,如果我使用Locale::acceptFromHttp解析HTTP Accept-Language标头,是否有一种简单可靠的方法来根据此区域设置标识符获取用户的首选货币?就像“en-US”的“USD”一样。

我希望有一种方法可以用PHP intl extension来做到这一点,但到目前为止还无法在手册中找到我的答案。我看到Zend Framework可以用Zend_Currency做到这一点,但它对我的特定软件来说太过臃肿了。

任何其他库或实现此目的的方法?由于必须有很多区域设置标识符,因此简单switch有点过分。

2 个答案:

答案 0 :(得分:1)

您可以使用setlocale()localeconv()在PHP 4和PHP 5中执行此操作:

$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键中。

答案 1 :(得分:1)

有点晚了,但你可以使用\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;
    },
    []
);