Holen Sie sich das Währungssymbol in PHP

Lesezeit: 5 Minuten

Benutzer-Avatar
umpirsky

Beginnen wir mit einem einfachen Codestück zum Formatieren von Geld NumberFormatter:

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

Das druckt: ¥123,456,789.

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

Aber was ich tun möchte, ist das Währungssymbol (z. B. ¥) für den ISO 4217-Code der gegebenen Währung (z. B. JPY) zu erhalten.

Meine erste Vermutung war, es zu versuchen mit:

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

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

Gibt es eine Möglichkeit, das Währungssymbol nach ISO 4217-Währungscode in PHP zu erhalten?

  • Das Problem ist, dass das Währungssymbol entweder vor oder nach der Zahl erscheinen kann. Wofür verwendest du das Symbol?

    –Tom B

    16. Dezember 2012 um 0:44 Uhr

  • Machen Sie einfach eine Regex für alles, was keine Ziffer oder ein Komma ist. Etwas wie /[^0-9,]*/.

    – rmobis

    16. Dezember 2012 um 0:45 Uhr


  • Einige der Symbole werden Multi-Byte sein, sodass eine einfache Zeichenfolgensuche nicht sehr gut funktioniert.

    – kryptisches ツ

    16. Dezember 2012 um 1:06 Uhr

  • Ich möchte Regex vermeiden. Eigentlich wollte ich reparieren github.com/symfony/symfony/blob/master/src/Symfony/Component/… und diese Regex loswerden, ich dachte, PHP unterstützt dies. Danke trotzdem.

    – umpirsky

    16. Dezember 2012 um 1:13 Uhr

  • Die nützlichste verwandte Ressource, die ich gefunden habe, ist diese (ja, es ist Python, aber alle diese Funktionen sind in PHP verfügbar), was eine etwas unangenehme “Lösung” ist. Die Wurzel des Problems besteht darin, dass diese Funktionalität davon abhängt, dass das Host-Betriebssystem über die entsprechenden Gebietsschemainformationen verfügt – aber gleichzeitig sehe ich keinen Grund dafür, dass dies innerhalb dieser Einschränkungen nicht möglich ist.

    – DaveRandom

    16. Dezember 2012 um 1:19 Uhr

Zunächst einmal gibt es keine internationale globale Währungssymboltabelle, die jeder auf dem Planeten lesen und verstehen könnte.

In jeder Region/jedem Land sind die Währungssymbole unterschiedlich, deshalb müssen Sie sie anhand des Browsers/Benutzergebietsschemas bestimmen, je nachdem, wer liest.

Der richtige Weg ist, wie Sie vermutet haben, NumberFormatter::CURRENCY_SYMBOL zu verwenden, aber Sie müssen zuerst das entsprechende Gebietsschema wie einstellen en-US@currency=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;

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

Zum Beispiel ist $symbol:

  • Kanadischer Dollar (CAD) : CA$ in den USA, CAD in Rumänien , $CA in Iran
  • Iranischer Rial (IRR): IRR in den USA, während im Iran sein wird

  • Exzellent!! +1. Ich wünschte nur, es gäbe eine Möglichkeit zum Abrufen locale nach Währung iso. Etwas wie rlocaleconv(int_curr_symbol, 'JPY') oder so!

    – Fr0zenFyr

    27. Januar 2017 um 13:14 Uhr

Benutzer-Avatar
umpirsky

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

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

kehrt zurück

'€'.

Symfony-Version > 4.3

Es ist erwähnenswert, dass dies für SF4.3 und höher veraltet ist:

/**
 * Returns the bundle containing currency information.
 *
 * @return CurrencyBundleInterface The currency resource bundle
 *
 * @deprecated since Symfony 4.3, to be removed in 5.0. Use {@see Currencies} instead.
 */
public static function getCurrencyBundle(): CurrencyBundleInterface
{

Also, stattdessen können Sie Folgendes tun:

use Symfony\Component\Intl\Currencies;
echo Currencies::getSymbol('AUD'); 

  • Technisch (IMHO) beantwortet dies nicht die Frage, bei der es um PHP ging, nicht um Symfony.

    – geoidetisch

    15. August 2015 um 13:07 Uhr

  • @geoidesic Ich habe diese Frage gestellt und das Ziel ist es, das Währungssymbol in PHP zu erhalten. Die Verwendung von Bibliotheken von Drittanbietern ist erlaubt und wird empfohlen.

    – umpirsky

    16. August 2015 um 8:08 Uhr

  • Außerdem, was für eine schöne Syntax.

    – Iharob Al Asimi

    27. März 2017 um 19:29 Uhr

  • Siehe die Antwort von Federico Nicolas Motta.

    – Philipp M.

    12. September 2018 um 0:36 Uhr

Benutzer-Avatar
kryptisch ツ

Da die Symbole Multi-Byte sein können, habe ich mb_* () -Funktionen verwendet, um alle Zeichen ohne Satzzeichen und Nicht-Ziffern korrekt zu erfassen, die nur das Symbol verlassen würden.

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

  • Währungssymbole können aus mehr als einem Zeichen bestehen, zB Estland Kroon = „kr“.

    – Nico

    16. Dezember 2012 um 1:24 Uhr

  • Währungssymbol ist nicht immer ein Zeichen en.wikipedia.org/wiki/Currency_sign. Vielen Dank.

    – umpirsky

    16. Dezember 2012 um 9:47 Uhr

  • @umpirsky Bitte sehen Sie sich den aktualisierten Code an, der Symbole mit mehreren Zeichen unterstützt.

    – kryptisches ツ

    16. Dezember 2012 um 20:00 Uhr

  • Ja, aber es ist hacky, ähnlich wie github.com/symfony/symfony/blob/master/src/Symfony/Component/… Ich werde es akzeptieren, wenn ich keine andere Lösung finde. Vielen Dank.

    – umpirsky

    17. Dezember 2012 um 7:28 Uhr

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

Sie können verwenden Symfony Intl Komponente

Installieren Sie es über den Composer mit composer require symfony/intl

Dann erhalten Sie das HTML-Symbol mit dem Folgenden

use Symfony\Component\Intl\Currencies;
\Locale::setDefault('en');
$symbol = Currencies::getSymbol('INR'); // => '₹'
echo $symbol;

Benutzer-Avatar
Benuvogel

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

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

Dies ist eine schöne einfache Inline-Lösung, die keine weitere Funktion deklarieren muss, aber auch nicht alle Fälle richtig behandelt – dh Währungen, bei denen Buchstaben Teil der Ausgabe sind. Aber um zB zwischen $ und £ zu unterscheiden, funktioniert es gut.

Benutzer-Avatar
Mc-Benutzer

Zend_Locale::getTranslationList('CurrencySymbol')

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

Kann dann so verwendet werden:

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

1312100cookie-checkHolen Sie sich das Währungssymbol in PHP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy