> Faqs > Cómo validar un entero en PHP o una cadena con todos los caracteres numéricos

Cómo validar un entero en PHP o una cadena con todos los caracteres numéricos

Tengo una variable en PHP que quiero validar como entero, si se da uno de estos supuestos:

  • Que la variable es de tipo entero (con lo que estamos seguros que su contenido es un número sin decimales)
  • Que la variable sea una cadena de texto en la que solamente haya caracteres numéricos (cualquier número de dígitos del 0 al 9)

Puede ocurrir cualquiera de estos supuestos y en ellos debe dar el entero como válido.

Respuestas

La respuesta de Guillermo no es suficientemente buena, ya que en algunos casos puede dar un warning, ya que ctype_digit() necesita una cadena. Si la invocas así: isIntegerOrStringWhithNumericCharacters(54.6) te dará un warning.

Yo voy a dar otra respuesta que considero más válida:

Puedes comprobar si una variable en PHP es un entero o si tiene todos los caracteres numéricos utilizando varias funciones y métodos disponibles en el lenguaje. A menudo podrás usar una combinación de varios métodos para validar varias cosas a la vez.

La solución que me quedaría yo sería esta:

$variable = 42;

if (is_numeric($variable) && $variable == (int)$variable) {
    echo 'La variable es un entero o contiene solo caracteres numéricos';
} else {
    echo 'La variable no es un entero o no contiene solo caracteres numéricos';
}

Y en una función quedaría así:

function isIntegerOrStringWhithNumericCharacters($value) {
    return (is_numeric($value) && $value == (int) $value) ? true  : false;
}

En este caso, la función is_numeric() verifica si la variable es numérica o una cadena numérica. Sin embargo, si le damos algo como 45.8 nos diría true porque lo considera numérica y sin embargo no es entero.

Por eso luego le hacemos un casting a entero:

(int) $variable

Eso hará que se quiten los decimales, si es que los había. Luego verificamos si la variable es lo mismo que tenemos después de hacerle el casting a entero, en cuyo caso entendemos que ya era un entero.

Otras alternativas

  1. Utilizando la función is_int():

    Esta función devuelve true si la variable enviada por parámetro es un entero.

    $variable = 42;
    
    if (is_int($variable)) {
        echo 'La variable es un entero';
    } else {
        echo 'La variable no es un entero';
    }
    

    Solo que no te dice si es una cadena numérica... si es cadena numérica te dirá que no es entero.

  2. Utilizando la función ctype_digit():

    Esta función verifica si todos los caracteres de la cadena enviada por parámetro son dígitos. Ten en cuenta que ctype_digit espera una cadena como parámetro, por lo que si tienes un número no irá bien y te mostrará un warning... aunque el mensaje que te da ahora en php 8 nos dice esto "Deprecated: ctype_digit(): Argument of type int will be interpreted as string" por lo que me deja con dudas. De todos modos, esta función podrías usarla después de que is_int() no te haya dicho que es un entero.

    $variable = '42';
    
    if (ctype_digit($variable)) {
        echo 'La variable contiene solo caracteres numéricos';
    } else {
        echo 'La variable no contiene solo caracteres numéricos';
    }
    
Alfonso
293 11 19 18
Gracias por mejorar la solución que había tomado y explicarme los detalles de tu código.

PHP ofrece dos funciones para validar los enteros, pero is_int() solo valida valores de tipo entero. Y por su parte ctype_digit() solo valida correctamente valores de tipo string. Así que lo que buscaba es una unión de ambas funciones.

He realizado esta función de PHP que realiza el objetivo que se estaba buscando, de validar un valor como entero.

function isIntegerOrStringWhithNumericCharacters($value) {
    return is_int($value) || ctype_digit($value) ? true : false;
}
Guillermo
130 4 8 12