Start · Sprachen · PHP · Referenz · numfmt_parse

numfmt_parse

Funktion

Parst einen formatierten Zahlen-String anhand eines <code>NumberFormatter</code>-Objekts und gibt den numerischen Wert zurück.

seit PHP 5.3.0 Kategorie: string

Signatur

numfmt_parse(NumberFormatter $formatter, string $string, int $type = NumberFormatter::TYPE_DOUBLE, int &$offset = null): int|float|false

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

Typ
int|float|false
Beschreibung
Gibt den geparsten numerischen Wert als 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;
}
Geparste Zahl: 1234567.89

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"
Geparste Zahl: 42.75 Parse-Ende bei Offset: 5 Rest des Strings: 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"
Geparste Ganzzahl: 3500 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.