2012-12-16 132 views
33

讓我們用一段簡單的代碼開始錢NumberFormatter格式:獲取貨幣符號在PHP

$formatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY); 
echo $formatter->formatCurrency(123456789, 'JPY'); 

此打印:¥123,456,789

這是好的,如果你想格式化錢。

但我想要做的是獲得給定貨幣ISO 4217代碼(例如日元)的貨幣符號(例如¥)。

我的第一個猜測是使用嘗試:

$formatter->getSymbol(NumberFormatter::CURRENCY_SYMBOL); 

但是,讓$在我的情況在構造函數(EN_US)給定區域貨幣符號。

有沒有辦法通過貨幣ISO 4217代碼在PHP中獲取貨幣符號?

+0

問題是貨幣符號可能出現在數字之前或之後。你在用什麼符號? –

+4

只要爲任何不是數字或逗號的正則表達式。像'/ [^ 0-9,] * /'。 – rmobis

+0

某些符號將是多字節,因此簡單的字符串搜索將不會很好。 –

回答

9

我實現了這個使用https://github.com/symfony/Intl

Symfony\Component\Intl\Intl::getCurrencyBundle()->getCurrencySymbol('EUR') 

回報

'€'. 
+2

技術上(恕我直言)這實際上不回答這個問題,這是關於PHP,而不是Symfony。 – geoidesic

+3

@geoidesic我問了這個問題,目標是在PHP中獲取貨幣符號。允許和鼓勵使用第三方庫。 – umpirsky

+0

另外,多麼美麗的語法。 –

3

由於符號可以是多字節,所以我使用mb _ *()函數來正確獲取所有非標點符號和非數字字符,這些字符只會留下符號。

function get_currency_symbol($string) 
{ 
    $symbol = ''; 
    $length = mb_strlen($string, 'utf-8'); 
    for ($i = 0; $i < $length; $i++) 
    { 
     $char = mb_substr($string, $i, 1, 'utf-8'); 
     if (!ctype_digit($char) && !ctype_punct($char)) 
      $symbol .= $char; 
    } 
    return $symbol; 
} 

$format = new NumberFormatter('en_US', NumberFormatter::CURRENCY); 
$string = $format->formatCurrency(123456789, 'JPY'); 
echo get_currency_symbol($string); 
+0

貨幣符號可能不止一個字符,例如愛沙尼亞克朗=「kr」。 – Niko

+0

@Niko最大2 char? –

+0

[ISO 4217](http://en.wikipedia.org/wiki/ISO_4217)指定了三個字母。 – Charles

-1

試試這個變種:

$formatter->getSymbol(NumberFormatter::INTL_CURRENCY_SYMBOL); 
+1

不,返回iso代碼。 – umpirsky

0

隱祕有一個很好的答案,但有一個更簡單w ^唉做到這一點:

preg_replace('#[a-z0-9.]*#i', '', $formatter->formatCurrency('0', $currency)) 

這是一個不需要聲明另一個函數一個很好的簡單的在線解決方案,但是它也無法正確處理所有的情況下 - 即貨幣有文字的輸出的一部分。但爲了區分例如$和£,它工作正常。

27

首先,沒有國際全球貨幣符號表,地球上的任何人都可以閱讀和理解。

在每個區域/國家/地區貨幣符號將有所不同,這就是爲什麼您必須使用瀏覽器/用戶區域設置根據誰在閱讀來確定它們。

正確的方法是,你猜到了,使用的NumberFormatter :: CURRENCY_SYMBOL,但你首先要設置相應的語言環境像的en-US @貨幣= JPY

$locale='en-US'; //browser or user locale 
$currency='JPY'; 
$fmt = new NumberFormatter($locale."@currency=$currency", NumberFormatter::CURRENCY); 
$symbol = $fmt->getSymbol(NumberFormatter::CURRENCY_SYMBOL); 
header("Content-Type: text/html; charset=UTF-8;"); 
echo $symbol; 

這樣的符號將用戶可以理解。

例如,$符號將是:

  • 加元(CAD):CA $在美國,CAD在羅馬尼亞,$ CA在伊朗
  • 伊朗Rial(IRR):IRR in USA,而在伊朗將爲
+0

優秀!! +1。我只是希望有一種方法可以根據貨幣'iso'檢索'locale'。像'rlocaleconv(int_curr_symbol,'JPY')''左右! – Fr0zenFyr

0
Zend_Locale::getTranslationList('CurrencySymbol') 

會給你一個3字母貨幣代碼的關聯數組到他們的符號。

然後可以使用這樣的:

$curArr = Zend_Locale::getTranslationList('CurrencySymbol'); 
echo $curArr['GBP']; 
1

如果您在使用此功能setlocale("LC_ALL", "es_AR"); 您可以使用localeconv()['currency_symbol']localeconv()['int_curr_symbol']獲得本地貨幣符號和貨幣符號的國際變化設置的語言環境。

+0

這是爲什麼降低投票率? – clentfort