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?
Ich habe dies mit https://github.com/symfony/Intl erreicht:
Symfony\Component\Intl\Intl::getCurrencyBundle()->getCurrencySymbol('EUR')
kehrt zurück
'€'.
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:
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);
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'];
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.