¿Espero que haya algo en el mismo espacio conceptual que la antigua IsNumeric()
función VB6 ?
javascript
validation
numeric
Electrones_Ahoy
fuente
fuente
isNaN("")
,isNaN(" ")
,isNaN(false)
, etc. Devuelvefalse
para éstos, lo que implica que son los números.Respuestas:
Para verificar si una variable (incluyendo una cadena) es un número, verifique si no es un número:
Esto funciona independientemente de si el contenido variable es una cadena o un número.
Ejemplos
Por supuesto, puede negar esto si lo necesita. Por ejemplo, para implementar el
IsNumeric
ejemplo que dio:Para convertir una cadena que contiene un número en un número:
Solo funciona si la cadena solo contiene caracteres numéricos, de lo contrario, regresa
NaN
.Ejemplos
Para convertir una cadena libremente a un número
Útil para convertir '12px' a 12, por ejemplo:
Ejemplos
Carrozas
Tenga en cuenta que, a diferencia de
+num
,parseInt
(como su nombre lo indica) convertirá un flotador en un entero cortando todo siguiendo el punto decimal (si desea usarloparseInt()
debido a este comportamiento, probablemente sea mejor usar otro método ) :Cadenas vacías
Las cadenas vacías pueden ser un poco contra-intuitivas.
+num
convierte cadenas vacías o cadenas con espacios a cero, yisNaN()
asume lo mismo:Pero
parseInt()
no está de acuerdo:fuente
isNaN
"Para verificar si una variable no es un número". "no es un número" no es lo mismo que "IEEE-794 NaN", que es lo que seisNaN
prueba. En particular, este uso falla al probar booleanos y cadenas vacías, al menos. Ver developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .var n = 'a'; if (+n === +n) { // is number }
es ~ 3994% más rápido que isNaN en la última versión de Chrome. Vea la prueba de rendimiento aquí: jsperf.com/isnan-vs-typeof/5isNaN(1 + false + parseInt("1.do you trust your users?"))
Y usted podría seguir el camino RegExp:
fuente
Si solo está tratando de verificar si una cadena es un número entero (sin decimales), la expresión regular es una buena manera de hacerlo. Otros métodos como
isNaN
son demasiado complicados para algo tan simple.Para permitir solo números enteros positivos , use esto:
fuente
/^-?\d+$/
¿Correcto?Si realmente quiere asegurarse de que una cadena contiene sólo un número, cualquier número (entero o de coma flotante), y exactamente un número, no se puede utilizar
parseInt()
/parseFloat()
,Number()
o!isNaN()
por sí mismos. Tenga en cuenta que en!isNaN()
realidad está devolviendotrue
cuándoNumber()
devolvería un número yfalse
cuándo volveríaNaN
, por lo que lo excluiré del resto de la discusión.El problema con
parseFloat()
es que devolverá un número si la cadena contiene algún número, incluso si la cadena no contiene solo y exactamente un número:¡El problema
Number()
es que devolverá un número en los casos en que el valor pasado no sea un número en absoluto!El problema con rodar su propia expresión regular es que, a menos que cree la expresión regular exacta para que coincida con un número de coma flotante, ya que Javascript lo reconoce, perderá casos o reconocerá casos donde no debería hacerlo. E incluso si puedes rodar tu propia expresión regular, ¿por qué? Hay formas integradas más simples de hacerlo.
Sin embargo, resulta que
Number()
(yisNaN()
) hace lo correcto para cada caso dondeparseFloat()
devuelve un número cuando no debería, y viceversa. Entonces, para averiguar si una cadena es realmente exacta y solo un número, llame a ambas funciones y vea si ambas devuelven verdadero:fuente
' 1'
,'2 '
y' 3 '
todo vuelve verdadero.isNumber
función no están tratando con interfaces de usuario. Además, una buena entrada de números no permitirá espacios para comenzar.La respuesta aceptada para esta pregunta tiene bastantes fallas (como lo destacan algunos otros usuarios). Esta es una de las formas más fáciles y probadas de abordarlo en javascript:
A continuación se presentan algunos buenos casos de prueba:
fuente
Pruebe la función isNan :
fuente
isNaN()
retornosfalse
para cualquier cadena que contiene sólo espacios en blanco caracteres, incluyendo cosas como '\ u00a0'.Antigua pregunta, pero faltan varios puntos en las respuestas dadas.
Notación cientifica.
!isNaN('1e+30')
estrue
, sin embargo, en la mayoría de los casos cuando las personas piden números, no quieren hacer coincidir cosas como1e+30
.Los grandes números flotantes pueden comportarse de forma extraña.
Observar (usando Node.js):
Por otra parte:
Entonces, si uno espera
String(Number(s)) === s
, mejor limite sus cadenas a 15 dígitos como máximo (después de omitir los ceros iniciales).infinito
Dado todo eso, comprobar que la cadena dada es un número que satisface todo lo siguiente:
Number
volver aString
No es una tarea tan fácil. Aquí hay una versión simple:
Sin embargo, incluso este está lejos de estar completo. Los ceros iniciales no se manejan aquí, pero sí atornillan la prueba de longitud.
fuente
Lo he probado y la solución de Michael es la mejor. Vote por su respuesta anterior (busque en esta página "Si realmente quiere asegurarse de que hay una cadena" para encontrarla). En esencia, su respuesta es esta:
Funciona para cada caso de prueba, que documenté aquí: https://jsfiddle.net/wggehvp9/5/
Muchas de las otras soluciones fallan para estos casos extremos: '', nulo, "", verdadero y []. En teoría, podría usarlos, con el manejo adecuado de errores, por ejemplo:
o
con manejo especial para / \ s /, nulo, "", verdadero, falso, [] (y otros?)
fuente
Puede usar el resultado de Number al pasar un argumento a su constructor.
Si el argumento (una cadena) no se puede convertir en un número, devuelve NaN, por lo que puede determinar si la cadena proporcionada es un número válido o no.
Notas: Nota al pasar una cadena vacía o
'\t\t'
, y'\n\t'
como número devolverá 0; Pasar verdadero devolverá 1 y falso devolverá 0.fuente
Number
constructor es exactamente el mismo que+x
.Number()
maneja números flotantes, comoNumber.parseFloat()
noNumber.parseInt()
Tal vez haya una o dos personas que se encuentren con esta pregunta y necesiten una verificación mucho más estricta de lo habitual (como hice yo). En ese caso, esto podría ser útil:
¡Tener cuidado! Esto rechazará cadenas como
.1
,40.000
,080
,00.1
. Es muy exigente: la cadena debe coincidir con la " forma perfecta más mínima " del número para que pase esta prueba.Utiliza el constructor
String
yNumber
para convertir la cadena a un número y viceversa y, por lo tanto, comprueba si la "forma mínima perfecta" del motor JavaScript (la que se convirtió con elNumber
constructor inicial ) coincide con la cadena original.fuente
(str === String(Math.round(Number(str))))
."Infinity"
,"-Infinity"
y"NaN"
pase esta prueba. Sin embargo, esto se puede solucionar mediante unaNumber.isFinite
prueba adicional .str === ("" + +str)
. Básicamente verifica si la cadena es el resultado de stringificar un número JS. Sabiendo esto, también podemos ver un problema: la prueba pasa0.000001
pero falla0.0000001
, que es cuando1e-7
pasa. Lo mismo para números muy grandes.parseInt (), pero tenga en cuenta que esta función es un poco diferente en el sentido de que, por ejemplo, devuelve 100 para parseInt ("100px").
fuente
parseInt(09)
.paraseInt(09, 10)
, 10
argumento.parseInt('09')
ahora es igual a 9.Citar:
no es del todo cierto si necesita verificar espacios iniciales / finales - por ejemplo, cuando se requiere una cierta cantidad de dígitos, y necesita obtener, digamos, '1111' y no '111' o '111' para quizás un PIN entrada.
Mejor usar:
fuente
'-1'
,'0.1'
y'1e10'
todas falsas retorno. Además, los valores mayores que el infinito positivo o menores que el infinito negativo devuelven verdadero, mientras que probablemente deberían devolver falso.¿Por qué la implementación de jQuery no es lo suficientemente buena?
Michael sugirió algo como esto (aunque he robado la versión alterada de "user1691651 - John" aquí):
La siguiente es una solución con muy probablemente un mal desempeño, pero resultados sólidos. Es un artilugio hecho a partir de la implementación de jQuery 1.12.4 y la respuesta de Michael, con una verificación adicional para espacios iniciales / finales (porque la versión de Michael devuelve verdadero para los números con espacios iniciales / finales):
Sin embargo, la última versión tiene dos nuevas variables. Uno podría evitar uno de esos, haciendo:
No he probado mucho de estos, por otros medios que no son los manuales de los pocos casos de uso a los que me enfrentaré con mi situación actual, que es algo muy estándar. Esta es una situación de "pararse sobre los hombros de los gigantes".
fuente
No es válido para TypeScript como:
declare function isNaN(number: number): boolean;
Para TypeScript puede usar:
/^\d+$/.test(key)
fuente
Bueno, estoy usando este que hice ...
Ha estado funcionando hasta ahora:
Si encuentra algún problema, dígame, por favor.
fuente
return !isNaN(parseInt(value, 10));
Si alguien llega tan lejos, pasé algún tiempo pirateando esto tratando de parchar moment.js ( https://github.com/moment/moment ). Aquí hay algo que le quité:
Maneja los siguientes casos:
¡Cierto! :
¡Falso! :
Irónicamente, con el que estoy luchando más:
Cualquier sugerencia bienvenida. :]
fuente
isNumeric(' ')
yisNumeric('')
?&& (val.replace(/\s/g,'') !== '') //Empty && (val.slice(-1) !== '.') //Decimal without Number
a fin de adress el problema antes mencionado y que tuve yo.Usando JavaScript simple:
Usando Lodash:
fuente
fuente
2019: Incluye ejemplos de ES3, ES6 y TypeScript
Tal vez esto se ha repetido muchas veces, sin embargo, luché con este hoy también y quería publicar mi respuesta, ya que no vi ninguna otra respuesta que lo haga de manera simple o completa:
ES3
ES6
Mecanografiado
Esto parece bastante simple y cubre todas las bases que vi en muchas otras publicaciones y pensé:
También puede probar su propia
isNumeric
función y simplemente pasar en estos casos de uso y buscar "verdadero" para todos ellos.O, para ver los valores que cada uno devuelve:
fuente
2019: comprobación de validez numérica práctica y estricta
A menudo, un 'número válido' significa un número Javascript excluyendo NaN e Infinity, es decir, un 'número finito'.
Para verificar la validez numérica de un valor (de una fuente externa, por ejemplo), puede definir en el estilo de ESlint Airbnb:
y úsalo de esta manera:
fuente
PFB la solución de trabajo:
fuente
Ahórrese el dolor de cabeza de tratar de encontrar una solución "incorporada".
No hay una buena respuesta, y la respuesta enormemente votada en este hilo es incorrecta.
npm install is-number
fuente
Recientemente escribí un artículo sobre formas de garantizar que una variable sea un número válido: https://github.com/jehugaleahsa/artifacts/blob/master/2018/typescript_num_hack.md. El artículo explica cómo garantizar un punto flotante o un entero, si eso es importante (
+x
vs~~x
).El artículo asume que la variable es a
string
o anumber
para empezar ytrim
está disponible / polyfilled. No sería difícil extenderlo para manejar otros tipos, también. Aquí está la carne:fuente
Mi intento de un poco confuso, quizás no sea la mejor solución
fuente
042
) y hexadecimal (0x45f
)En mi aplicación solo permitimos az AZ y 0-9 caracteres. Encontré que la respuesta anterior usando " string % 1 === 0" funcionó a menos que la cadena comenzara con 0xnn (como 0x10) y luego la devolvería como numérica cuando no quisiéramos. La siguiente trampa simple en mi verificación numérica parece hacer el truco en nuestros casos específicos.
Advertencia : Esto podría estar explotando un error de larga data en Javascript y Actionscript [Número ("1" + the_string)% 1 === 0)], no puedo hablar de eso, pero es exactamente lo que necesitábamos.
fuente
% 1
operación numérica en ellas), y eso interpretará la cadena como un literal hexadecimal o flotante.Mi solución:
Puede agregar condiciones adicionales dentro del ciclo, para satisfacer sus necesidades particulares.
fuente
Puede utilizar tipos, como con la biblioteca de flujo , para obtener una comprobación de tiempo de compilación estática. Por supuesto, no es terriblemente útil para la entrada del usuario.
fuente
Aquí hay una línea para verificar si
sNum
es un valor numérico válido; Ha sido probado para una amplia variedad de entradas:fuente
Solo use
isNaN()
, esto convertirá la cadena a un número y si obtiene un número válido , devolveráfalse
...fuente
Estoy usando lo siguiente:
fuente
1..1
,1,1
,-32.1.12
, y lo más importante fallaundefined
yNaN
. Si pasóundefined
oNaN
que eso le devolvería un falso positivo diciendo que era un número.