it-swarm.com.de

Holen Sie sich das Währungssymbol PHP

Beginnen wir mit einem einfachen Code, um Geld mit NumberFormatter zu formatieren:

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

Dies druckt: ¥123,456,789.

Dies ist in Ordnung, wenn Sie Geld formatieren möchten.

Aber ich möchte ein Währungssymbol (z. B. ¥) für einen ISO 4217-Währungscode (z. B. JPY) erhalten.

Meine erste Vermutung war zu versuchen:

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

Aber das gibt das Währungssymbol für das Gebietsschema, das im Konstruktor (en_US) angegeben ist, in meinem Fall $.

Gibt es eine Möglichkeit, ein Währungssymbol mit dem ISO 4217-Code in PHP zu erhalten?

36
umpirsky

Ich habe dies mit https://github.com/symfony/Intl erreicht:

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

kehrt zurück

'€'.
11
umpirsky

Erstens gibt es keine internationale globale Währungssymboltabelle, die jeder auf der Erde lesen und verstehen könnte.

In jeder Region/Land unterscheiden sich die Währungssymbole. Daher müssen Sie sie anhand des Lesers des Browsers/Benutzers anhand der Ländereinstellung des Browsers/Benutzers ermitteln.

Der richtige Weg ist, wie Sie erraten haben, mit NumberFormatter :: CURRENCY_SYMBOL, aber Sie müssen zuerst das entsprechende Gebietsschema wie en-US @ currency = JPY einstellen:

$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;

Auf diese Weise wird das Symbol für den Benutzer verständlich.

Das Symbol $ lautet beispielsweise:

  • Kanadischer Dollar (CAD): CA $ in den USA,CADin Rumänien, $ CA im Iran
  • Iran Rial (IRR):IRRin den USA, während in Iran
33
idragosalex

Da die Symbole Multibyte sein können, habe ich mit mb ​​_ * () - Funktionen alle Nicht-Interpunktions- und Nicht-Zeichen-Zeichen richtig erfasst, wodurch das Symbol einfach verlassen würde.

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);
3
cryptic ツ

Wenn Sie das Gebietsschema mit dieser Funktion setlocale("LC_ALL", "es_AR");.__ festlegen, können Sie localeconv()['currency_symbol'] oder localeconv()['int_curr_symbol'] verwenden, um das Währungssymbol des Gebietsschemas und die internationale Variation des Währungssymbols zu erhalten. 

Zend_Locale::getTranslationList('CurrencySymbol')

Gibt Ihnen ein assoziatives Array von 3-Buchstaben-Währungscodes zu ihrem Symbol.

Kann dann so verwenden:

$curArr = Zend_Locale::getTranslationList('CurrencySymbol');
echo $curArr['GBP'];
0
Rob Clarkson

Cryptic hat eine gute Antwort, aber es gibt einen einfacheren Weg:

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

Dies ist eine einfache Inline-Lösung von Nice, für die keine weitere Funktion deklariert werden muss. Allerdings werden auch nicht alle Fälle richtig behandelt, d. Zur Unterscheidung zwischen z. $ und £, es funktioniert gut.

0
Benubird