Die Validierung von deutschen Kommazahlen mit PHP

Ich glaube jeder PHP Entwickler stand schon mindestens einmal vor dem Problem deutsche Kommazahlen validieren zu müssen. Da ich gerade für vergleichen-und-sparen.de eine Applikation überarbeite, die Eingabefelder für Formulare erstellt und validiert, stolperte ich auch über die bisherige Realisierung der Validierung von Kommazahlen im deutschen Format. Da ich hier ziemlich aufwendige reguläre Ausdrücke verwendet habe, um ein Komma und einen Punkt in Dezimalzahlen zu finden, habe ich mir gedacht, dass das doch auch einfacher gehen muss. Also sah ich noch mal ins Manual und warf einen Blick auf die Datenfilterung von PHP 5.

Was in der PHP Dokumentation nicht so klar herausgestellt wird, sind die Optionen und die Flags, die man der filter_var() Funktion mitgeben kann, um ein bestimmtes Verhalten hervorzurufen. Nehmen wir die einfache Anwendung der filter_var() Funktion als Beispiel.

1
2
3
4
5
6
$result = filter_var(
    '1.234,56', 
    FILTER_VALIDATE_FLOAT
);
var_dump($result);
// Ergebnis: bool(false)

Wie anhand dieses Beispiels ersichtlich wird, können wir eine deutsche Kommazahl also nicht mit der filter_var() Funktion validieren. Die Funktion liefert in diesem Fall einfach false und somit ist die Variable keine Kommazahl (Float). Ist das wirklich so? Das Manual gibt in der Beschreibung zur Funktion filter_var() nur bekannt, dass eine Kommazahl einen Punkt als Dezimal Zeichen haben muss. Lediglich die Beschreibung zu den vorhandenen Filtern gibt einen Hinweis auf die Optionen, die man anwenden kann. Daraus ergibt sich folgendes Beispiel.

1
2
3
4
5
6
7
8
$options = array('decimal' => ',');
$result = filter_var(
    '1.234,56', 
    FILTER_VALIDATE_FLOAT, 
    array('options' => $options, 'flags' => FILTER_FLAG_ALLOW_THOUSAND)
);
var_dump($result);
// Ergebnis: float(1234.56)

Ah! Die Erleuchtung! Somit erhalten wir also aus einer deutschen Kommazahl eine für PHP verwendbare Kommazahl, mit der weiter gearbeitet werden kann. Und das alles mit nur einer Funktion. Kein aufwendiges Ersetzen von Punkten und Kommata.

Man kann mit den PHP Filtern aber noch weitaus mehr machen. Man muss nicht immer validieren. Man kann eine Kommazahl auch einfach bereinigen (sanitize).

Die Sanitize Filter für Kommazahlen arbeiten ein wenig anders als die Filter zur Validierung. Folgendes Beispiel macht den Unterschied deutlich.

1
2
3
4
5
6
7
$result = filter_var(
    '1.234,56', 
    FILTER_SANITIZE_NUMBER_FLOAT, 
    FILTER_FLAG_ALLOW_THOUSAND
);
var_dump($result);
// Ergebnis: string(7) "1234,56"

Das Ergebnis ist hier ein String. Das Komma wird beibehalten. Der Tausender-Punkt wird entfernt. Durch die Bereinigung haben wir also auch eine valide Kommazahl.

Da haben wir heute ja wieder was gelernt. 😉

About Author: Marcel
Ich bin Senior PHP Developer bei MM Newmedia. Seit 2005 bin ich begeisterter Webentwickler und arbeite als Freelancer für namenhafte Firmen und entwickle jede Menge abgefahrenes Zeug und berichte darüber in meinem Blog.

Kommentar verfassen