¿Cómo puedo comprobar si una cadena es un número válido?
Espero que haya algo en el mismo espacio conceptual que la antigua IsNumeric()
función VB6.
2 de octubre de 2020: tenga en cuenta que muchos enfoques básicos están plagados de errores sutiles (por ejemplo, espacios en blanco, análisis parcial implícito, base, coerción de matrices, etc.) que muchas de las respuestas aquí no tienen en cuenta. La siguiente implementación podría funcionar para usted, pero tenga en cuenta que no admite separadores de números distintos del punto decimal " .
":
function isNumeric(str) {
if (typeof str != "string") return false // we only process strings!
return !isNaN(str) && // use type coercion to parse the _entirety_ of the string (`parseFloat` alone does not do this)...
!isNaN(parseFloat(str)) // ...and ensure strings of whitespace fail
}
Para comprobar si una variable (incluida una cadena) es un número, compruebe si no es un número:
Esto funciona independientemente de si el contenido de la variable es una cadena o un número.
isNaN(num) // returns true if the variable does NOT contain a valid number
Ejemplos
isNaN(123) // false
isNaN('123') // false
isNaN('1e10000') // false (This translates to Infinity, which is a number)
isNaN('foo') // true
isNaN('10px') // true
isNaN('') // false
isNaN(' ') // false
isNaN(false) // false
Por supuesto, puedes negar esto si es necesario. Por ejemplo, para implementar el IsNumeric
ejemplo que diste:
function isNumeric(num){
return !isNaN(num)
}
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, devuelve NaN
.
+num // returns the numeric value of the string, or NaN
// if the string isn't purely numeric characters
Ejemplos
+'12' // 12
+'12.' // 12
+'12..' // NaN
+'.12' // 0.12
+'..12' // NaN
+'foo' // NaN
+'12px' // NaN
Para convertir una cadena libremente en un número
Útil para convertir '12px' a 12, por ejemplo:
parseInt(num) // extracts a numeric value from the
// start of the string, or NaN.
Ejemplos
parseInt('12') // 12
parseInt('aaa') // NaN
parseInt('12px') // 12
parseInt('foo2') // NaN These last three may
parseInt('12a5') // 12 be different from what
parseInt('0x10') // 16 you expected to see.
flotadores
Tenga en cuenta que, a diferencia de +num
, parseInt
(como sugiere el nombre) convertirá un flotante en un número entero cortando todo lo que sigue al punto decimal (si desea usarlo parseInt()
debido a este comportamiento, probablemente sea mejor que utilice otro método ). :
+'12.345' // 12.345
parseInt(12.345) // 12
parseInt('12.345') // 12
Cadenas vacías
Las cadenas vacías pueden resultar un poco contrarias a la intuición. +num
convierte cadenas vacías o cadenas con espacios a cero y isNaN()
asume lo mismo:
+'' // 0
+' ' // 0
isNaN('') // false
isNaN(' ') // false
Pero parseInt()
no está de acuerdo:
parseInt('') // NaN
parseInt(' ') // NaN
Si solo estás intentando comprobar si una cadena es un número entero (sin decimales), la expresión regular es una buena forma de hacerlo. Otros métodos como isNaN
son demasiado complicados para algo tan simple.
function isNumeric(value) {
return /^-?\d+$/.test(value);
}
console.log(isNumeric('abcd')); // false
console.log(isNumeric('123a')); // false
console.log(isNumeric('1')); // true
console.log(isNumeric('1234567890')); // true
console.log(isNumeric('-23')); // true
console.log(isNumeric(1234)); // true
console.log(isNumeric(1234n)); // true
console.log(isNumeric('123.4')); // false
console.log(isNumeric('')); // false
console.log(isNumeric(undefined)); // false
console.log(isNumeric(null)); // false
Para permitir sólo números enteros positivos utilice esto:
function isNumeric(value) {
return /^\d+$/.test(value);
}
console.log(isNumeric('123')); // true
console.log(isNumeric('-23')); // false