W3docs

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): bool

Recibe 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

php— editable, runs on the server

$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 de echo al probar booleanos. echo imprime true como "1" y false como una cadena vacía, lo que es fácil de malinterpretar. var_dump() imprime bool(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 que is_numeric() ve un int simple y devuelve true.
  • Un sufijo de unidad hace que toda la cadena sea no numérica. "42px" es false. Si necesitas extraer un número de dicha cadena, usa el casting (int) o filter_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() e is_float() se preocupan por el tipo declarado: solo devuelven true para un int o float real, 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.

Práctica

Práctica
¿Qué hace la función is_numeric en PHP?
¿Qué hace la función is_numeric en PHP?
Was this page helpful?