2010-11-28 81 views
2

說,如果我解析HTTP Accept-Language頭與Locale::acceptFromHttp是否有一種簡單可靠的方法來獲取基於此區域設置標識符的用戶的首選貨幣?像「美國」爲「en-US」。獲取貨幣基於區域設置的ISO 4217代碼

我希望有一種方法可以用PHP intl extension來做到這一點,但到目前爲止在手冊中找不到我的答案。我看到Zend Framework可以通過Zend_Currency完成,但它對於我的特定軟件來說太臃腫了。

任何其他庫或實現此目的的方法?由於必須有很多區域設置標識符,所以簡單的switch有點過分。

回答

1

可以在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關鍵之內。

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; 
    }, 
    [] 
);