Signatur
Beschreibung
numfmt_parse_currency() ist die prozedurale Variante von NumberFormatter::parseCurrency() aus der Intl-Erweiterung. Sie analysiert einen formatierten Währungs-String (z. B. "1.234,56 €") anhand der Regeln des übergebenen NumberFormatter-Objekts und extrahiert dabei sowohl den Float-Wert als auch den ISO-4217-Währungscode (z. B. "EUR").
Der erkannte Währungscode wird in den per Referenz übergebenen Parameter $currency geschrieben. Optional kann über $offset die Position im String angegeben werden, ab der das Parsen beginnen soll; nach dem Aufruf enthält $offset die Position, an der das Parsen endete.
Diese Funktion ist besonders nützlich bei der Verarbeitung von lokalisierten Preisangaben aus Nutzereingaben oder externen Datenquellen, da sie die länderspezifischen Tausendertrennzeichen, Dezimalseparatoren und Währungssymbole korrekt interpretiert.
Wichtig: Die Funktion setzt eine korrekt konfigurierte NumberFormatter-Instanz mit dem Stil NumberFormatter::CURRENCY voraus. Schlägt das Parsen fehl, wird false zurückgegeben und der Fehler kann mit numfmt_get_error_code() bzw. numfmt_get_error_message() ausgelesen werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $formatter Pflicht | NumberFormatter | Ein NumberFormatter-Objekt, das mit dem Stil NumberFormatter::CURRENCY und der gewünschten Locale erstellt wurde. |
|
| $string Pflicht | string | Der zu parsende lokalisierte Währungs-String, z. B. "1.234,56 €" oder "$1,234.56". |
|
| $currency Pflicht | string | Referenz-Parameter, in den der erkannte ISO-4217-Währungscode (z. B. "EUR", "USD") geschrieben wird. |
|
| $offset | int | 0 | Optionaler Referenz-Parameter: Startposition im String (0-basiert). Nach dem Aufruf enthält er die Position, an der das Parsen endete. |
Rückgabewert
float zurück. Bei einem Fehler (ungültiges Format, nicht parsebarer String) wird false zurückgegeben.Beispiele
Einfaches Parsen eines Euro-Betrags
<?php
$formatter = numfmt_create('de_DE', NumberFormatter::CURRENCY);
$string = '1.234,56 €';
$currency = '';
$value = numfmt_parse_currency($formatter, $string, $currency);
if ($value !== false) {
echo 'Betrag: ' . $value . PHP_EOL; // 1234.56
echo 'Währung: ' . $currency . PHP_EOL; // EUR
} else {
echo 'Parsen fehlgeschlagen: ' . numfmt_get_error_message($formatter);
}
Parsen eines US-Dollar-Betrags mit Offset
<?php
$formatter = numfmt_create('en_US', NumberFormatter::CURRENCY);
$string = 'Preis: $2,500.00 inkl.';
$currency = '';
$offset = 7; // Parsen ab Position 7 (nach "Preis: ")
$value = numfmt_parse_currency($formatter, $string, $currency, $offset);
if ($value !== false) {
echo 'Betrag: ' . $value . PHP_EOL; // 2500
echo 'Währung: ' . $currency . PHP_EOL; // USD
echo 'Ende-Offset: ' . $offset . PHP_EOL; // Position nach dem geparsten Teil
} else {
echo 'Fehler: ' . numfmt_get_error_message($formatter);
}
Fehlerbehandlung bei ungültigem Eingabe-String
<?php
$formatter = numfmt_create('de_DE', NumberFormatter::CURRENCY);
$currency = '';
$value = numfmt_parse_currency($formatter, 'kein Betrag', $currency);
if ($value === false) {
echo 'Fehlercode: ' . numfmt_get_error_code($formatter) . PHP_EOL;
echo 'Fehlermeldung: ' . numfmt_get_error_message($formatter) . PHP_EOL;
}
// Wichtig · Fallstricke
Sicherheitshinweis: Vertrauen Sie dem zurückgegebenen Float-Wert nicht blind für Finanzberechnungen. Aufgrund der inhärenten Ungenauigkeit von Gleitkommazahlen sollten monetäre Beträge intern als Integer (Cent-Beträge) oder mit einer Bibliothek für beliebige Präzision (z. B. bcmath) verarbeitet werden.
Locale-Abhängigkeit: Das Ergebnis hängt vollständig von der beim NumberFormatter eingestellten Locale ab. Ein String im deutschen Format ("1.234,56 €") kann mit einer englischen Locale nicht korrekt geparst werden — prüfen Sie daher, dass Formatter-Locale und Eingabeformat übereinstimmen.
OOP-Äquivalent: Diese Funktion entspricht der Methode NumberFormatter::parseCurrency() und kann austauschbar verwendet werden.
Die Intl-Erweiterung muss aktiviert sein (extension=intl in der php.ini); andernfalls steht die Funktion nicht zur Verfügung.