Start · Sprachen · PHP · Referenz · numfmt_parse_currency

numfmt_parse_currency

Funktion

Parst einen formatierten Währungs-String und gibt den numerischen Wert sowie den Währungscode zurück.

seit PHP 5.3.0 Kategorie: string

Signatur

numfmt_parse_currency(NumberFormatter $formatter, string $string, string &$currency, int &$offset = null): float|false

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

Typ
float|false
Beschreibung
Gibt den geparsten numerischen Wert als 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);
}
Betrag: 1234.56 Währung: EUR

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);
}
Betrag: 2500 Währung: USD Ende-Offset: 16

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;
}
Fehlercode: 9 Fehlermeldung: U_PARSE_ERROR

// 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.