2012-12-16 23 views
33

Zacznijmy od prostego kawałek kodu do formatowania pieniądze z NumberFormatter:Get symbol waluty w PHP

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

Drukuje: ¥123,456,789.

Jest to ok, jeśli chcesz sformatować pieniądze.

Ale chcę uzyskać symbol waluty (np. ¥) dla danej waluty kod ISO 4217 (np. JPY).

Moje pierwsze przypuszczenie było spróbować użyć:

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

Ale to daje symbol waluty dla danej lokalizacji w konstruktorze (pl), $ w moim przypadku.

Czy istnieje sposób na uzyskanie symbolu waluty według kodu ISO 4217 w języku PHP?

+0

Problem polega na tym, że symbol waluty może pojawić się przed lub po numerze. Do czego używasz tego symbolu? –

+4

Po prostu wykonaj wyrażenie regularne dla wszystkiego, co nie jest cyfrĘ ... ani przecinkiem. Coś jak '/ [^ 0-9,] * /'. – rmobis

+0

Niektóre symbole będą wielobajtowe, więc proste wyszukiwanie ciągów nie zadziała zbyt dobrze. –

Odpowiedz

9

I to osiągnąć za pomocą https://github.com/symfony/Intl:

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

powraca

'€'. 
+2

Technicznie (IMHO) to w rzeczywistości nie odpowiada na pytanie, które dotyczyło PHP, a nie Symfony. – geoidesic

+3

@geoidesic Zadałem to pytanie, a celem jest zdobycie symbolu waluty w PHP. Korzystanie z bibliotek stron trzecich jest dozwolone i zalecane. – umpirsky

+0

Co za piękna składnia. –

3

Ponieważ symbole mogą być wielobajtowe, użyłem funkcji mb _ *(), aby poprawnie pobrać wszystkie znaki nie będące znakami interpunkcyjnymi i cyfry, które właśnie opuściłyby symbol.

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

Symbole walut mogą mieć więcej niż jeden znak, np. Estonia Kroon = "kr". – Niko

+0

@Niko ma 2 znaki maksymalne? –

+0

[ISO 4217] (http://en.wikipedia.org/wiki/ISO_4217) określa trzy litery. – Charles

-1

Spróbuj Wariant:

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

Nie, zwraca kod iso. – umpirsky

0

Cryptic ma dobrej odpowiedzi, ale jest prostsza w ay to zrobić:

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

Jest to ładne proste rozwiązanie inline, który nie wymaga deklarowania inną funkcję, jednak również nie prawidłowo obsłużyć wszystkie przypadki - czyli Waluty gdzie litery są częścią wyjściu. Ale dla rozróżnienia między np. $ i £, działa dobrze.

27

Po pierwsze, nie ma międzynarodowej tablicy symboli globalnej waluty, którą każdy na świecie mógłby przeczytać i zrozumieć.

W każdym regionie/kraju symbole walut będą się różnić, dlatego należy je określić na podstawie tego, kto czyta, korzystając z ustawień przeglądarki/użytkownika.

Prawidłowy sposób jest tak zgadliście, używając NumberFormatter :: CURRENCY_SYMBOL, ale najpierw trzeba ustawić odpowiednie lokum jak en-US = @ waluty 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; 

ten sposób symbol być zrozumiałym dla użytkownika.

Na przykład, $ symbol będą:

  • dolar kanadyjski (CAD): CA $ w USA, CAD w Rumunii, $ CA w Iranie
  • Iran Rial (IRR): IRR w USA, natomiast w Iranie będzie
+0

Doskonały !! +1. Żałuję, że nie było sposobu na odzyskanie 'locale' opartego na walucie' iso'. Coś w rodzaju 'rlocaleconv (int_curr_symbol, 'JPY')' lub tak! – Fr0zenFyr

0
Zend_Locale::getTranslationList('CurrencySymbol') 

Poda tablicę skojarzonych 3-literowych kodów walut do ich symboli.

można następnie wykorzystać tak:

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

Po ustawieniu locale za pomocą tej funkcji setlocale("LC_ALL", "es_AR"); Można użyć localeconv()['currency_symbol'] lub localeconv()['int_curr_symbol'] uzyskać symbol waluty narodowe i międzynarodowe odmianę symbol waluty.

+0

Dlaczego jest on odrzucany? – clentfort