PHP tiene una intval()
función que convertirá una cadena en un número entero. Sin embargo, quiero comprobar que la cadena es un número entero de antemano, para poder dar un mensaje de error útil al usuario si está equivocado. PHP tiene is_int()
, pero eso devuelve falso para una cadena como "2"
.
PHP tiene la is_numeric()
función, pero eso devolverá verdadero si el número es un doble. Quiero algo que devuelva falso para un doble, pero cierto para un int.
p.ej:
my_is_int("2") == TRUE
my_is_int("2.1") == FALSE
Respuestas:
¿Qué tal el uso
ctype_digit
?Del manual:
El ejemplo anterior generará:
Esto solo funcionará si su entrada es siempre una cadena:
Si su entrada puede ser de tipo
int
, combínelactype_digit
conis_int
.Si le importan los números negativos, deberá verificar la entrada de un precedente
-
y, de ser así, invocarctype_digit
unasubstr
de las cadenas de entrada. Algo como esto lo haría:fuente
ctype_digit(abs($str))
lugar de soloctype_digit
.abs('definitelynotanint') === 0
. por otra parte,ctype_digit
solo toma hilosfilter_var
Deberías hacerlo:pero
Si solo desea booleanos como valores de retorno, ajústelo en una función, por ejemplo
fuente
==
quizás?if
3v4l.org/IAvCF+1 a la respuesta de Dominic (usando
ctype_digit
). Otra forma de hacerlo es con la coerción de tipo:fuente
is_int($inty + 0) && is_numeric($inty)
(sé que es una solución perezosa, pero funciona para la mayoría de las intenciones y propósitos ...Envíalo a int. si todavía tiene el mismo valor, int;
fuente
return $var == (int) $var;
Fuente .
fuente
elseif
puede ser simplementeif
porque ya has regresado en la declaración anterior.$data
es un objeto, esto regresaránull
. Mejor tener elreturn false;
al final.Tenía la necesidad de un robusto
is_int
recientemente. Encontré intval () demasiado impredecible:Encontré este fragmento en los comentarios de la documentación de PHP, y después de probarlo, cubre casi todo lo que le arrojas:
Pero cuidado:
fuente
Una forma realmente limpia que me gusta usar es esa. Lo lanzas dos veces, primero adentro
int
, segundo adentrostring
, luego comparas estrictamente===
. Vea el siguiente ejemplo:Ahora, sobre su función my_is_int, puede hacer algo como esto:
fuente
fuente
'/^[-+]?[0-9]+$/'
Estoy usando este:
fuente
Puede verificar si hay un número, si es así, verifique que al casting se le dé un doble o no:
Solo para números positivos:
Comprobándolo:
Salida:
fuente
Prueba esto:
También funciona si su cadena de $ tiene decimales
fuente
Esto también se encargará del número negativo
fuente
fuente
Ideé una forma que no pude encontrar en ningún lado, así que lo estoy poniendo aquí:
Sin más preámbulos es esto:
ctype_digit((string) abs($input))
Ejemplo:
Resultados: (son como se esperaba, supongo)
fuente
Quizás no sea la forma más eficaz de hacerlo. Pero puedes escribirlo en una línea.
Como se esperaba:
Gotcha:
fuente
Algunos años tarde, pero en base a las respuestas dadas aquí, se me ocurrió una solución que es un poco más precisa (en booleanos, en particular) y más eficiente (creo) que la mayoría de las otras respuestas:
Trabajando como se esperaba para estos:
Excepto tal vez por estos 2:
fuente
Qué tal si:
Esta función solo debe devolver verdadero para cualquier número de cadena que se pueda convertir a int con
(int)
ointval()
sin perder nada de importancia matemática (como no ceros después del punto decimal o números fuera del rango entero de PHP) mientras se aceptan cosas que no son matemáticamente significativas (como el espacio en blanco; ceros a la izquierda; o, después del punto decimal, ceros exclusivamente).Volverá falso para
'10.'
pero no para'10.0'
. Si desea'10.'
ser sincero, puede cambiar el+
después0
de la expresión regular a*
.fuente
Aquí hay un código que he usado que parece funcionar bien y no tiene ninguno de los problemas que tienen muchos de los otros.
No verifica el orden, etc., por lo que no está destinado a enteros negativos, sino con algún código de adición que también se puede hacer usando algunas de las otras ideas anteriores. También se puede adaptar para trabajar con binarios
array('0', '1')
o hexadecimales, etc.fuente
Mira esto. Convierte $ val en entero y luego comprueba si el $ val original convertido en cadena es IDÉNTICO (===), solo == no funcionará como se esperaba, en el entero val convertido en cadena.
Si no verifica los valores de cadena, puede que no funcione como lo espera:
Salida:
La razón es que incluso si usa hexadecimal (0x101010), octal (01) o un número entero almacenado como flotante (1.0, 0.0), internamente todos se almacenan como flotante. Sin embargo, si usa la función para verificar int almacenado como una cadena, funcionará.
fuente
fuente
Puede usar la siguiente condición. ¡Tenga en cuenta que no debe usar! ==
fuente
Funciona perfectamente! Espero que te sea útil =)
fuente
Si desea saber realmente si una cadena es una representación válida de un verdadero tipo entero de PHP ...
Sin embargo, esto es imposible de ejecutar ya que el conjunto es demasiado grande (no cabe en la memoria en este caso, si realiza un bucle en su lugar, tomará demasiados ciclos de CPU).
Quizás pueda hacer una búsqueda binaria con comparación de cadenas, sin embargo, hay mejores formas.
El ser más simple:
Hay otras formas inusuales de abordarlo, como:
También puede hacer una comparación de cadenas, pero aún tendrá que hacer cosas como ctype_digit, verificar que la longitud sea razonable (no desperdicie la CPU antes de hacer cosas como ctype_digit) y tener un manejo incómodo para los números negativos.
Tenga en cuenta que filter_var no afirma correctamente que una cadena es realmente la representación de un entero PHP. Permitirá un espacio en blanco inicial + y circundante.
Internamente, PHP usa la función "_zend_handle_numeric_str" para una comparación estricta, pero no expone directamente esto en ningún lado, de ahí el truco que usa las teclas de matriz (que lo usa para convertir cualquier cadena que sea una representación de un entero PHP en un entero PHP).
Si desea una conversión segura binaria hacia y desde PHP, este es el enfoque a seguir.
No todos pueden querer eso y podría ser un caso de manejo de la entrada del usuario. filter_var no es tan malo para eso y será bastante seguro en la mayoría de los casos para las personas nuevas en PHP.
Una verificación de longitud, ctype_digit y luego una verificación del valor convertido de que está en un rango también es bastante sólida para la entrada del usuario. Los esquemas más complejos pueden querer recortar o regex.
El problema con muchas de las respuestas aquí a ese respecto es que, si bien la pregunta es vaga, las respuestas no deberían serlo. Si va a proponer una solución, debería poder explicar exactamente qué es lo que esperará y qué no. Sin eso, no se sabe si una respuesta coincide con una pregunta o si es segura. El manual de PHP no siempre ayuda porque no explica todas las advertencias para cada uno de los métodos relevantes que proporciona. Cosas como ctype_digit e is_int son muy confiables y fáciles de predecir, pero los detalles de is_numeric, filter_var y malabares (+ $ var) o casting (intval / floatval) están poco documentados.
Este es PHP fudge para ti. Tiene una gran cantidad de esquemas para interpretar cadenas como enteros, con inconsistencias. El método más estricto para validar una cadena entera no está expuesto directamente al usuario.
fuente
Si está manejando ID numéricos de mysql y está tratando de imponer una validación para que sea un int no cero válido o un
int
pero en formato de cadena ( ya que mysql siempre devuelve todo en formato de cadena ) y noNULL
. Puedes usar lo siguiente. Esta es la forma más a prueba de error / advertencia / aviso para permitir soloint/string-ints
lo que encontré.fuente
Aquí hay una solución simple que usa is_numeric , floatval e intval :
Resultados:
Tenga en cuenta que los valores mayores que PHP_INT_MAX pueden devolver falso.
fuente
Podría usar is_numeric () y luego verificar la presencia de "." en la cadena (aunque no particularmente sensible a la cultura).
Alternativamente, use is_numeric (), luego convierta a un doble y vea si $ var == floor ($ var) (debería devolver verdadero si es un entero).
fuente