Jeder Entwickler muss regelmäßig prüfen, ob Werte wirklich numerisch sind. Die Funktion is_numeric() ist dabei das zentrale Werkzeug in PHP. In diesem Leitfaden erfährst du alles, was du über is_numeric() wissen musst.

1. Einleitung: Was ist is_numeric() und warum ist sie wichtig?
is_numeric() prüft, ob ein Wert als Zahl gilt. In PHP brauchst du das, weil viele Daten als String ankommen – zum Beispiel aus Formularen, APIs oder Konfigurationsdateien.
Wenn du Werte nicht sicher prüfst, riskierst du unerwartete Fehler oder Schwachstellen. Hier liest du, was is_numeric() genau macht, worauf du achten musst und wie sich die Funktion von ähnlichen Prüfmöglichkeiten unterscheidet.
2. Grundlagen der PHP is_numeric()-Funktion
Bevor du is_numeric() einsetzt, solltest du die grundlegende Funktionsweise kennen.
2.1. Syntax
Die Syntax ist bewusst einfach gehalten.
/** Prüft, ob ein Wert numerisch ist */
$bErgebnis = is_numeric($mWert);
2.2. Parameter
is_numeric() benötigt genau einen Parameter.
- $mWert (mixed): Jeder Wert, den du prüfen möchtest – egal ob String, Integer, Float, Boolean, Array oder Objekt.
2.3. Rückgabewert
Die Funktion liefert ein boolsches Ergebnis.
- TRUE – wenn der Wert eine Zahl oder ein numerischer String ist
- FALSE – in allen anderen Fällen
2.4. Definition von „numerisch“ für is_numeric()
Was gilt für is_numeric() als „numerisch“? Die Antwort ist überraschend vielseitig.
-
Ganzzahlen (Integer): z.B. 42, -7
-
Gleitkommazahlen (Float): z.B. 3.14, -0.5
-
Numerische Strings:
- Zahlen als Strings, z.B. "123", "-42"
- Floats als Strings, z.B. "3.14159"
- Wissenschaftliche Notation, z.B. "1.23e4" oder "7.1E-10"
Wichtig:
Auch Strings mit Vorzeichen oder Exponenten erkennt is_numeric() als numerisch. Beispiele: "+123", "-45", "2.5e3".
3. is_numeric() in der Praxis: Detaillierte Beispiele
Die Funktion is_numeric() reagiert auf verschiedene Datentypen unterschiedlich. Sieh dir die folgenden Fälle und die jeweilige Ausgabe von var_dump() an.
3.1. Standard-Datentypen
In der Praxis prüfst du meist klassische Werte: Integer, Float, Strings.
$aTestwerte = [
42,
3.14159,
"123",
"3.14",
"-99",
"Hallo",
true,
null,
[],
new stdClass()
];
foreach($aTestwerte as $mWert) {
/** Gibt Wert und Ergebnis der Prüfung aus */
var_dump($mWert, is_numeric($mWert));
}
Erwartete Ausgaben:
- Integer: TRUE
- Float: TRUE
- Numerische Strings (“123”, “3.14”, “-99”): TRUE
- Nicht-numerische Strings (“Hallo”): FALSE
- Boolean, NULL, Array, Objekt: FALSE
Auch ausgefallenere numerische Schreibweisen prüft is_numeric() korrekt.
var_dump(is_numeric("+123")); /** TRUE */
var_dump(is_numeric("-45.67")); /** TRUE */
var_dump(is_numeric("1.23e5")); /** TRUE */
var_dump(is_numeric("7.1E-10")); /** TRUE */
Diese Vielfalt macht is_numeric() zu einem sehr flexiblen Werkzeug.
3.3. Randfälle und unerwartetes Verhalten (PHP-Versionsspezifisch)
Nicht jeder Fall verhält sich intuitiv – vor allem zwischen verschiedenen PHP-Versionen gibt es Unterschiede.
Hexadezimal-Strings
In PHP < 7.0.0 galten hexadezimale Strings wie "0xf4c3b00c" als numerisch.
Seit PHP 7.0.0 gilt: Hexadezimal-Strings sind nicht numerisch.
var_dump(is_numeric("0xf4c3b00c")); // PHP < 7.0.0: TRUE | PHP >= 7.0.0: FALSE
Binäre und oktale Strings
Werte wie "0b1010" (binär) oder "0123" (oktal) erkennt is_numeric() nicht als numerisch, da diese nur als Integer-Literal, nicht aber als String numerisch sind.
var_dump(is_numeric("0b1010")); // Immer FALSE
var_dump(is_numeric("0123")); // Immer TRUE (da nur Ziffern), aber nicht als Oktal erkannt!
Leerzeichen
Leerzeichen am Anfang oder in der Mitte führen immer zu FALSE.
Am Ende des Strings kommt es auf die PHP-Version an:
var_dump(is_numeric("42 ")); /* PHP < 8.0.0: FALSE | PHP >= 8.0.0: TRUE */
var_dump(is_numeric(" 42")); // Immer FALSE
var_dump(is_numeric("4 2")); // Immer FALSE
Leere Strings, NULL, Boolean, Array, Objekt
Leere Strings, NULL, Boolean, Arrays und Objekte erkennt is_numeric() immer als nicht numerisch.
var_dump(is_numeric("")); // FALSE
var_dump(is_numeric(null)); // FALSE
var_dump(is_numeric(true)); // FALSE
var_dump(is_numeric([])); // FALSE
var_dump(is_numeric(new stdClass())); // FALSE
Visuelle Hilfe: Verhaltenstabelle
Mit dieser Tabelle erkennst du auf einen Blick, wie is_numeric() auf verschiedene Eingabewerte und Spezialfälle reagiert – inklusive PHP-Versionsunterschieden.
Eingabe | Erwartetes Ergebnis | Hinweise / Version |
123 | TRUE | Integer |
“123” | TRUE | String, nur Ziffern |
“3.14” | TRUE | Float-String |
“-42” | TRUE | Vorzeichen |
“+7.1E-10” | TRUE | Exponent |
“0xf4c3b00c” | FALSE | Seit PHP 7.0.0 |
“0b1010” | FALSE | Nie numerisch |
"42 " | TRUE/FALSE | Seit PHP 8.0.0 TRUE |
" 42" | FALSE | Immer FALSE |
“4 2” | FALSE | Immer FALSE |
“” | FALSE | Leer |
null | FALSE | NULL |
true/false | FALSE | Boolean |
[] | FALSE | Array |
new stdClass() | FALSE | Objekt |
4. is_numeric() vs. ctype_digit() vs. filter_var(): Wann welche Funktion nutzen?
Nicht jede Zahlenprüfung ist gleich. Je nach Kontext gibt es bessere oder schlechtere Methoden. Vergleiche daher die wichtigsten Funktionen.
4.1. is_numeric()
Setze is_numeric() ein, wenn du beliebige numerische Werte oder Strings prüfen möchtest, egal ob Ganzzahl, Float, Dezimalpunkt, Vorzeichen oder wissenschaftliche Notation.
4.2. ctype_digit()
Nutze ctype_digit(), um zu prüfen, ob ein String nur aus Dezimalziffern besteht. Das Ergebnis ist nur dann TRUE, wenn alle Zeichen Ziffern sind – keine Vorzeichen, kein Dezimalpunkt, kein Exponent!
var_dump(ctype_digit("123")); // TRUE
var_dump(ctype_digit("00123")); // TRUE
var_dump(ctype_digit("-123")); // FALSE
var_dump(ctype_digit("3.14")); // FALSE
4.3. filter_var() mit FILTER_VALIDATE_INT und FILTER_VALIDATE_FLOAT
Mit filter_var() validierst du präziser und kannst zugleich den Wert umwandeln.
Für Ganzzahlen:
/** Prüft, ob ein Wert ein Integer ist */
$bIstGanzzahl = filter_var("42", FILTER_VALIDATE_INT) !== false; // TRUE
$bIstGanzzahlNegativ = filter_var("-42", FILTER_VALIDATE_INT) !== false; // TRUE
Für Gleitkommazahlen:
$bIstFloat = filter_var("3.14", FILTER_VALIDATE_FLOAT) !== false; // TRUE
$bIstFloatMitKomma = filter_var("3,14", FILTER_VALIDATE_FLOAT, ["options" => ["decimal" => ","]]) !== false; /* TRUE, mit dezimalem Komma */
4.4. Vergleichstabelle
Die Tabelle zeigt auf einen Blick, worin sich die Funktionen unterscheiden. So kannst du je nach Anwendungsfall gezielt entscheiden, welche Methode am besten passt.
Funktion | Erkennt | Schwächen/Besonderheiten | Ideal für |
is_numeric() | Integer, Float, numerische Strings, Exponent | Erlaubt viele Formate, z. B. “+3.14”, “2e3” | Allgemeine Zahlenprüfung |
ctype_digit() | Nur positive Integer-Strings (Ziffern) | Keine Vorzeichen, kein Punkt, kein Exponent | IDs, Mengenangaben |
filter_var() (INT/FLOAT) | Integer/Float, mit strikter Typprüfung | Lehnt numerische Strings mit Leerzeichen ab | Validierung und Umwandlung |
5. Häufige Fehler und Best Practices
Viele Stolperfallen ergeben sich durch falsche Annahmen oder Versionsunterschiede. Hier findest du die wichtigsten Tipps.
5.1. Missverständnisse
- ctype_digit() prüft keine negativen Zahlen oder Floats! Viele verwechseln ctype_digit() mit einer universellen Zahlenprüfung.
- Hexadezimale Strings: Das Verhalten von is_numeric() hat sich seit PHP 7 geändert. Prüfe genau, welche PHP-Version du einsetzt.
- Leerzeichen: Sei vorsichtig bei Benutzereingaben mit führenden oder nachgestellten Leerzeichen.
5.2. Best Practices
- Validierungsbedarf analysieren: Entscheide zuerst, welche Zahlenformate du erlauben willst.
- Spezifische Checks: Kombiniere is_numeric() mit weiteren Prüfungen, z.B. floatval() oder intval(), um Typkonvertierungen zu sichern.
- filter_var() für komplexe Validierungen: Wenn du z.B. einen Wertebereich prüfen willst oder bestimmte Formatierungen brauchst, nutze filter_var().
6. Anwendungsfälle in der Praxis
Der Alltag liefert viele typische Szenarien, bei denen du is_numeric() sicher einsetzen kannst.
Nutzer geben z.B. ihr Alter oder den Preis ein. Hier prüfst du zuerst, ob der Wert überhaupt eine Zahl ist, bevor du ihn speicherst oder verarbeitest.
if (isset($_POST['sAlter']) && is_numeric($_POST['sAlter'])) {
$iAlter = intval($_POST['sAlter']);
/** Weiterverarbeitung z.B. speichern oder vergleichen */
}
6.2. API-Eingangsdatenvalidierung
Viele APIs erwarten numerische Parameter. Prüfe eingehende Werte direkt:
if (is_numeric($sApiWert)) {
$dApiWert = floatval($sApiWert);
/** Wert weiterverwenden */
}
6.3. Datenbank-Interaktionen
Sichere SQL-Abfragen verlangen, dass du nur gültige numerische Werte in die Datenbank schreibst.
if (is_numeric($sPreis)) {
$sSql = "INSERT INTO produkte (preis) VALUES (" . floatval($sPreis) . ")";
/** Query absetzen */
}
6.4. Konfigurationsdateien
Liest du Einstellungen aus INI- oder JSON-Dateien, prüfe deren numerischen Inhalt, um Fehler frühzeitig zu vermeiden.
if (is_numeric($sTimeout)) {
$iTimeout = intval($sTimeout);
/** Wert anwenden */
}
7. Fazit
Mit is_numeric() prüfst du zuverlässig, ob Werte in PHP numerisch sind – egal, ob es sich um Zahlen, Floats oder passende Strings handelt.
Du solltest die Funktion immer bewusst wählen und im Zweifel mit weiteren Checks ergänzen, wenn dein Anwendungsfall mehr Präzision erfordert.
Für einfache Zahlenprüfungen reicht is_numeric() aus, aber für strikte Typen oder Bereichsvalidierung empfiehlt sich der Einsatz von filter_var().
So stellst du sicher, dass deine Anwendung robust und sicher mit numerischen Werten umgeht – und bist gewappnet für unerwartete Eingaben.