is_numeric()
La función is_numeric() de PHP comprueba si un valor es numérico o una cadena numérica. Aprende su sintaxis, casos límite y validación de entradas.
Introducción
is_numeric() es una función integrada de PHP que comprueba si un valor es un número o una cadena numérica. Esa última parte es la razón clave de su existencia: PHP recibe con frecuencia números como cadenas — desde campos de formulario, parámetros de consulta, JSON, archivos CSV — y necesitas una forma fiable de preguntar "¿podría esto tratarse como un número?" antes de hacer aritmética con él. is_numeric() responde exactamente a esa pregunta y devuelve un booleano.
Esta página cubre la sintaxis, qué se considera numérico (y qué sorprendentemente no lo es), cómo difiere de is_int() e is_float(), y un patrón práctico de validación de entradas.
Sintaxis
is_numeric(mixed $value): boolRecibe un único argumento, $value, y devuelve true si $value es un número o una cadena numérica, y false en caso contrario. Nunca lanza excepciones ni modifica su argumento.
Ejemplo básico
$var1 es la cadena "42", $var2 es el float 3.14, y $var3 es la cadena "hello". Los dos primeros son numéricos, por lo que is_numeric() devuelve true; el tercero no lo es.
Consejo: Usa
var_dump()en lugar deechoal probar booleanos.echoimprimetruecomo"1"yfalsecomo una cadena vacía, lo que es fácil de malinterpretar.var_dump()imprimebool(true)/bool(false)para que el resultado sea inequívoco.
Qué se considera numérico
Una cadena es numérica cuando representa un entero o float válido en notación decimal o científica. Esto incluye un signo inicial, un punto decimal inicial o final, espacios en blanco circundantes y exponentes:
<?php
var_dump(is_numeric("1e3")); // bool(true) — scientific notation (1000)
var_dump(is_numeric("+42")); // bool(true) — leading sign
var_dump(is_numeric("-0.5")); // bool(true) — negative float
var_dump(is_numeric(".5")); // bool(true) — leading decimal point
var_dump(is_numeric(" 42")); // bool(true) — leading whitespace
var_dump(is_numeric("0x1A")); // bool(false) — hex strings are NOT numeric (since PHP 7)
var_dump(is_numeric("0b101")); // bool(false) — binary strings are not numeric
var_dump(is_numeric("")); // bool(false) — empty string
var_dump(is_numeric("42px")); // bool(false) — trailing non-numeric characters
?>Los errores comunes:
- Las cadenas hexadecimales y binarias devuelven
false."0x1A"era numérico antes de PHP 7, pero ya no lo es. Los literales numéricos escritos en el código (p. ej.0x1A) ya son enteros reales, por lo queis_numeric()ve un int simple y devuelvetrue. - Un sufijo de unidad hace que toda la cadena sea no numérica.
"42px"esfalse. Si necesitas extraer un número de dicha cadena, usa el casting(int)ofilter_var()en su lugar. - Los espacios en blanco iniciales/finales son tolerados (los espacios al final pasaron a permitirse en PHP 8.0).
is_numeric() vs. is_int() e is_float()
Estas tres funciones son fáciles de confundir. La diferencia está en si importa el tipo o solo el valor:
<?php
$value = "10"; // a string that looks like a number
var_dump(is_numeric($value)); // bool(true) — value can be a number
var_dump(is_int($value)); // bool(false) — type is string, not int
var_dump(is_float($value)); // bool(false) — type is string, not float
?>is_numeric()se preocupa por el valor: "¿podría esto ser un número?" Acepta cadenas numéricas.is_int()eis_float()se preocupan por el tipo declarado: solo devuelventruepara unintofloatreal, nunca para una cadena.
Usa is_numeric() al validar entradas que llegan como texto; usa is_int() / is_float() cuando genuinamente necesitas conocer el tipo de una variable.
Uso práctico: validar entradas antes de hacer aritmética
El trabajo típico en el mundo real de is_numeric() es proteger las operaciones aritméticas sobre entradas no confiables para evitar TypeErrors o 0s silenciosos:
<?php
$inputs = ["100", "12.5", "5e2", "abc", "12px", ""];
foreach ($inputs as $in) {
if (is_numeric($in)) {
echo "$in is numeric -> " . ($in + 0) . "\n";
} else {
echo "$in is NOT numeric\n";
}
}
// 100 is numeric -> 100
// 12.5 is numeric -> 12.5
// 5e2 is numeric -> 500
// abc is NOT numeric
// 12px is NOT numeric
// is NOT numeric
?>Añadir + 0 (o hacer casting con (int) / (float)) convierte la cadena validada a un número real una vez que sabes que es seguro hacerlo. Para una validación más estricta — por ejemplo, aceptar solo enteros o aplicar un rango — combínalo con filter_var() y los filtros FILTER_VALIDATE_INT / FILTER_VALIDATE_FLOAT.
Conclusión
is_numeric() te indica de forma fiable si un valor — incluyendo una cadena — puede tratarse como un número, lo que lo convierte en la comprobación adecuada antes de hacer aritmética con datos de formularios, URLs o archivos. Recuerda que devuelve false para cadenas hexadecimales/binarias y para cualquier cadena con caracteres no numéricos al final, y que comprueba el valor, no el tipo — usa is_int() o is_float() cuando lo que importa es el tipo declarado. Consulta también gettype() y PHP Data Types para tener una visión más completa.