¿Cómo puedo comprobar si una cadena es un número válido?

Resuelto Electrons_Ahoy asked hace 15 años • 54 respuestas

Espero que haya algo en el mismo espacio conceptual que la antigua IsNumeric()función VB6.

Electrons_Ahoy avatar Oct 07 '08 02:10 Electrons_Ahoy
Aceptado

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 IsNumericejemplo 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. +numconvierte 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
Dan avatar Oct 06 '2008 19:10 Dan

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 isNaNson 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
Gavin avatar Jun 27 '2014 17:06 Gavin