¿Cómo verifico si una variable es un número entero en JavaScript y lanzo una alerta si no lo es? Intenté esto, pero no funciona:
<html>
<head>
<script type="text/javascript">
var data = 22;
alert(NaN(data));
</script>
</head>
</html>
javascript
JBa
fuente
fuente
parseInt
.Number.isInteger
cuál es la forma menos hacky.Respuestas:
Utilice el operador === ( igualdad estricta ) como se muestra a continuación,
fuente
2.0 === 2
dado que el decimal innecesario es solo una representación diferente del mismo número,parseInt(2.0) === 2.0
es equivalente a loparseInt(2) === 2
que es ciertoEso depende, ¿también quieres lanzar cadenas como enteros potenciales?
Esto lo hara:
Con operaciones bit a bit
Análisis y verificación simples
Cortocircuito y guardar una operación de análisis:
O tal vez ambos de una sola vez:
Pruebas:
Aquí está el violín: http://jsfiddle.net/opfyrqwp/28/
Actuación
Las pruebas revelan que la solución de cortocircuito tiene el mejor rendimiento (ops / seg).
Aquí hay un punto de referencia: http://jsben.ch/#/htLVw
Si te apetece una forma más corta y obtusa de cortocircuito:
Por supuesto, sugeriría dejar que el minificador se encargue de eso.
fuente
Suponiendo que no sabe nada sobre la variable en cuestión, debe adoptar este enfoque:
Para hacerlo mas simple:
fuente
"1.0"
es una cadena y, por lo tanto, no es un número. De1
lo contrario , será el valor de una variable si la configura de esta maneravar my_var=1.0;
, que esta función identifica correctamente como un entero.Number.isInteger()
funcionará ... hasta entonces, esta es una buena manera de hacerloNumber.isInteger()
Parece ser el camino a seguir.MDN también ha proporcionado el siguiente polyfill para navegadores que no admiten
Number.isInteger()
, principalmente todas las versiones de IE.Enlace a la página de MDN
fuente
Puede verificar si el número tiene un resto:
Eso sí, si su entrada también puede ser texto y desea verificar primero que no, entonces puede verificar el tipo primero:
fuente
0 % 1 === 0
en la consola. Vuelvetrue
como0 % 1
vueltas0
.0 % 1
regresa0
en modo de compatibilidad IE9, IE8 e IE7.Puede usar una expresión regular simple:
fuente
En primer lugar, NaN es un "número" (sí, sé que es extraño, simplemente rodar con él), y no una "función".
Debe verificar si el tipo de la variable es un número, y para verificar el número entero, usaría el módulo.
fuente
(0 == 0 || 0 % 1 == 0)
evaluará atrue
.0 % 1 == 0
también evalúa atrue
!%
no es división!Tenga cuidado al usar
cadena vacía ('') o booleana (verdadero o falso) volverá como entero. Es posible que no quieras hacer eso
Number.isInteger (datos)
función incorporada en el navegador. Dosis compatible con navegadores antiguos
Alternativas:
Sin embargo, Math.round () también fallará para cadenas vacías y booleanas
fuente
Para verificar si un entero como póster quiere:
observe + delante de los datos (convierte la cadena en número) y === para obtener información exacta.
Aquí hay ejemplos:
fuente
return (+data===parseInt(data))
?fuente
La solución más simple y limpia de pre-ECMAScript-6 (que también es lo suficientemente robusta como para devolver falso incluso si se pasa un valor no numérico como una cadena o nulo a la función) sería la siguiente:
La siguiente solución también funcionaría, aunque no tan elegante como la anterior:
Tenga en cuenta que Math.ceil () o Math.floor () podrían usarse igualmente bien (en lugar de Math.round ()) en la implementación anterior.
O alternativamente:
Una solución incorrecta bastante común es la siguiente:
Si bien este enfoque basado en parseInt funcionará bien para muchos valores de x, una vez que x se vuelva bastante grande, no funcionará correctamente. El problema es que parseInt () coacciona su primer parámetro a una cadena antes de analizar los dígitos. Por lo tanto, una vez que el número se vuelve lo suficientemente grande, su representación de cadena se presentará en forma exponencial (por ejemplo, 1e + 21). En consecuencia, parseInt () intentará analizar 1e + 21, pero dejará de analizar cuando llegue al carácter e y, por lo tanto, devolverá un valor de 1. Observe:
fuente
¿Por qué nadie ha mencionado
Number.isInteger()
?https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
Funciona perfectamente para mí y resuelve el problema con el
NaN
comienzo de un número.fuente
Number.isInteger()
, 3.5 años antes que usted: stackoverflow.com/a/27424770/5208540En ES6 se agregan 2 nuevos métodos para Number Object.
En él, el método Number.isInteger () devuelve verdadero si el argumento es un entero.
Ejemplo de uso:
fuente
El estándar ECMA-262 6.0 (ES6) incluye Number.isInteger función .
Para agregar soporte para el navegador antiguo, recomiendo usar una solución fuerte y compatible con la comunidad de:
https://github.com/paulmillr/es6-shim
que es pura biblioteca de polyfills ES6 JS .
Tenga en cuenta que esta lib requiere es5-shim, solo siga README.md.
fuente
Puede intentar
Number.isInteger(Number(value))
sivalue
puede ser un número entero en forma de cadena, por ejemplo,var value = "23"
y desea que esto evalúetrue
. Evite intentarloNumber.isInteger(parseInt(value))
porque esto no siempre devolverá el valor correcto. por ejemplo, sivar value = "23abc"
y usa elparseInt
implementación, aún sería verdadero.Pero si desea valores estrictamente enteros, entonces probablemente
Number.isInteger(value)
debería hacer el truco.fuente
fuente
Verifique si la variable es igual a esa misma variable redondeada a un entero, así:
fuente
true
deNaN
, por un simple cambio!=
de!==
e invirtiendo losif
bloques. Esto funciona porqueNaN
es el único valor en JavaScript que no es igual a sí mismo. Por ejemplo, el nuevo código debería serif (Math.round(x) === x) { /* x IS an integer! */ }
Además,
Number.isInteger()
. QuizásNumber.isSafeInteger()
es otra opción aquí usando el ES6 especificado.Para rellenar políticamente
Number.isSafeInteger(..)
en navegadores anteriores a ES6:fuente
Number.isInteger()
es la mejor manera si su navegador lo admite, si no, creo que hay muchas maneras de hacerlo:o:
o:
o:
ahora podemos probar los resultados:
Por lo tanto, todos estos métodos funcionan, pero cuando el número es muy grande, el operador parseInt y ^ no funcionaría bien.
fuente
Solo intenta esto:
fuente
Podrías usar esta función:
Volverá verdadero incluso si el valor es una cadena que contiene un valor entero.
Entonces, los resultados serán:
fuente
Mi acercamiento:
a >= 1e+21
La prueba solo puede pasar por un valor que debe ser un número y uno muy grande. Esto cubrirá todos los casos con seguridad, a diferencia de otras soluciones que se han proporcionado en esta discusión.a === (a|0)
Si el argumento de la función dada es exactamente (===) el mismo que el valor transformado a nivel de bits, significa que el argumento es un número entero.a|0
devolverá0
cualquier valora
que no sea un número , y si dea
hecho es un número, eliminará cualquier cosa después del punto decimal, por lo que1.0001
se convertirá1
fuente
Puede usar regexp para esto:
fuente
Desde http://www.toptal.com/javascript/interview-questions :
Descubrí que es la mejor manera de hacer esto.
fuente
Usa el
|
operador:Entonces, una función de prueba podría verse así:
fuente
Esto resolverá un escenario más ( 121. ), un punto al final
fuente
Para valores enteros positivos sin separadores:
Pruebas 1. si no está vacío y 2. si el valor es igual al resultado de un reemplazo de un carácter sin dígitos en su valor.
fuente
Ok tengo menos, porque no describió mi ejemplo, así que más ejemplos :):
Uso expresión regular y método de prueba:
fuente
también puedes probarlo de esta manera
o
fuente
data=22.5;
. También ambas ramas tienenconsole.log("not an integer")
:: STuve que verificar si una variable (cadena o número) es un número entero y usé esta condición:
http://jsfiddle.net/e267369d/1/
Algunas de las otras respuestas tienen una solución similar (en
parseFloat
combinación conisNaN
), pero la mía debería ser más sencilla y explicarse por sí misma.Editar: descubrí que mi método falla para las cadenas que contienen comas (como "1,2") y también me di cuenta de que en mi caso particular quiero que la función falle si una cadena no es un entero válido (debería fallar en cualquier flotante , incluso 1.0). Así que aquí está mi función Mk II:
http://jsfiddle.net/e267369d/3/
Por supuesto, en caso de que realmente necesite la función para aceptar flotantes enteros (1.0 cosas), siempre puede eliminar la condición de punto
a.indexOf('.') == -1
.fuente