Signatur
Beschreibung
numfmt_parse() ist die prozedurale Variante der Methode NumberFormatter::parse() aus der Internationalization Functions (intl)-Extension. Sie wandelt einen lokalisierten, formatierten Zahlen-String – etwa "1.234,56" im deutschen Format – in einen PHP-Zahlenwert (int oder float) um.
Der Parameter $type steuert den gewünschten Rückgabetyp. Mögliche Werte sind Konstanten wie NumberFormatter::TYPE_INT32, NumberFormatter::TYPE_INT64, NumberFormatter::TYPE_DOUBLE oder NumberFormatter::TYPE_CURRENCY. Standardmäßig wird TYPE_DOUBLE verwendet, was für die meisten Anwendungsfälle ausreicht.
Der optionale Parameter $offset (als Referenz) gibt an, ab welcher Zeichenposition im String das Parsen beginnen soll. Nach dem Aufruf enthält er die Position, an der das Parsen geendet hat. Dies ermöglicht das schrittweise Parsen langer Strings mit mehreren Zahlen.
Die Funktion ist besonders nützlich, wenn Benutzereingaben aus unterschiedlichen Regionen verarbeitet werden müssen, da Tausender- und Dezimaltrennzeichen je nach Locale variieren. Sie ergänzt damit numfmt_format() als Gegenstück für die Eingabeverarbeitung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $formatter Pflicht | NumberFormatter | Ein NumberFormatter-Objekt, das die Locale und Formatierungsregeln für die Interpretation des Strings vorgibt. |
|
| $string Pflicht | string | Der lokalisierte Zahlen-String, der geparst werden soll, z. B. "1.234,56" für das deutsche Format. |
|
| $type | int | NumberFormatter::TYPE_DOUBLE | Der gewünschte PHP-Typ des Rückgabewerts. Gültige Werte sind NumberFormatter::TYPE_INT32, NumberFormatter::TYPE_INT64, NumberFormatter::TYPE_DOUBLE und NumberFormatter::TYPE_CURRENCY. |
| $offset | int | null | Wird als Referenz übergeben. Gibt die Startposition des Parsens im String an. Nach dem Aufruf enthält er die Position, an der das Parsen geendet hat. |
Rückgabewert
int oder float zurück, je nach gewähltem $type. Im Fehlerfall (z. B. bei ungültigem Format oder nicht parsbarem String) wird false zurückgegeben. Mit numfmt_get_error_code() und numfmt_get_error_message() lässt sich der genaue Fehler ermitteln.Beispiele
Deutschen Zahlen-String parsen
<?php
// Formatter für deutsche Locale erstellen
$formatter = numfmt_create('de_DE', NumberFormatter::DECIMAL);
$string = '1.234.567,89';
$number = numfmt_parse($formatter, $string);
if ($number !== false) {
echo 'Geparste Zahl: ' . $number . PHP_EOL; // 1234567.89
} else {
echo 'Fehler beim Parsen: ' . numfmt_get_error_message($formatter) . PHP_EOL;
}
Parsen mit Typ-Angabe und Offset
<?php
// Formatter für englische (US) Locale erstellen
$formatter = numfmt_create('en_US', NumberFormatter::DECIMAL);
$string = '42.75 items';
$offset = 0;
$number = numfmt_parse($formatter, $string, NumberFormatter::TYPE_DOUBLE, $offset);
echo 'Geparste Zahl: ' . $number . PHP_EOL; // 42.75
echo 'Parse-Ende bei Offset: ' . $offset . PHP_EOL; // 5
echo 'Rest des Strings: ' . substr($string, $offset) . PHP_EOL; // " items"
Integer-Wert aus lokalisiertem String lesen
<?php
$formatter = numfmt_create('fr_FR', NumberFormatter::DECIMAL);
// Französisches Format: Leerzeichen als Tausendertrennzeichen
$string = '3 500';
$number = numfmt_parse($formatter, $string, NumberFormatter::TYPE_INT32);
echo 'Geparste Ganzzahl: ' . $number . PHP_EOL; // 3500
var_dump(gettype($number)); // string(7) "integer"
// Wichtig · Fallstricke
Sicherheitshinweis: Vertraue dem Rückgabewert nicht blind, ohne vorher auf false zu prüfen, insbesondere bei Benutzereingaben. Ein ungültiger String gibt false zurück, was bei loser Typenprüfung (==) leicht mit 0 verwechselt werden kann. Verwende stets den strikten Vergleich (===).
Locale-Abhängigkeit: Das Parsing-Ergebnis hängt vollständig von der Locale des NumberFormatter-Objekts ab. Ein mit de_DE erstellter Formatter interpretiert "1.000" als 1000 (Tausendertrennzeichen), während en_US dasselbe als 1.0 (Dezimaltrennzeichen) liest.
Erfordert die intl-Extension: Diese Funktion steht nur zur Verfügung, wenn PHP mit der intl-Extension kompiliert wurde (ab PHP 5.3). Stelle sicher, dass extension=intl in der php.ini aktiviert ist.