Cómo convertir una cadena a un número entero en JavaScript

Resuelto asked hace 15 años • 33 respuestas

¿Cómo convierto una cadena en un número entero en JavaScript?

 avatar Jul 16 '09 03:07
Aceptado

La forma más sencilla sería utilizar la Numberfunción nativa:

var x = Number("1000")

Si eso no funciona para usted, entonces existen los métodos parseInt , unary plus , parseFloat with floor y Math.round .

parseInt()

var x = parseInt("1000", 10); // You want to use radix 10
    // So you get a decimal number even with a leading 0 and an old browser ([IE8, Firefox 20, Chrome 22 and older][1])

más unario

Si su cadena ya tiene el formato de un número entero:

var x = +"1000";

piso()

Si su cadena es o podría ser un flotante y desea un número entero:

var x = Math.floor("1000.01"); // floor() automatically converts string to number

O, si vas a utilizar Math.floor varias veces:

var floor = Math.floor;
var x = floor("1000.01");

analizarFlotador()

Si eres del tipo que se olvida de poner la base cuando llamas a parseInt, puedes usar parseFloat y redondearlo como quieras. Aquí uso piso.

var floor = Math.floor;
var x = floor(parseFloat("1000.01"));

redondo()

Curiosamente, Math.round (como Math.floor) realizará una conversión de cadena a número, por lo que si desea redondear el número (o si tiene un número entero en la cadena), esta es una excelente manera, tal vez mi favorita:

var round = Math.round;
var x = round("1000"); // Equivalent to round("1000", 0)
Nosredna avatar Jul 15 '2009 20:07 Nosredna

Pruebe la función parseInt:

var number = parseInt("10");

Pero hay un problema. Si intenta convertir "010" usando la función parseInt, lo detecta como un número octal y devolverá el número 8. Por lo tanto, debe especificar una base (de 2 a 36). En este caso base 10.

parseInt(string, radix)

Ejemplo:

var result = parseInt("010", 10) == 10; // Returns true

var result = parseInt("010") == 10; // Returns false

Tenga en cuenta que parseIntignora los datos incorrectos después de analizar cualquier cosa válida.
Esta guía se analizará como 51:

var result = parseInt('51e3daf6-b521-446a-9f5b-a1bb4d8bac36', 10) == 51; // Returns true
Zanoni avatar Jul 15 '2009 20:07 Zanoni

Hay dos formas principales de convertir una cadena en un número en JavaScript. Una forma es analizarlo y la otra es cambiar su tipo a Número. Todos los trucos en las otras respuestas (por ejemplo, unario más) implican convertir implícitamente el tipo de cadena a un número. También puedes hacer lo mismo explícitamente con la función Número.

Analizando

const parsed = parseInt("97", 10);

parseInt y parseFloat son las dos funciones utilizadas para analizar cadenas en números. El análisis se detendrá silenciosamente si llega a un carácter que no reconoce, lo que puede ser útil para analizar cadenas como "92px", pero también es algo peligroso ya que no le dará ningún tipo de error por una entrada incorrecta, sino que Recibirás NaN a menos que la cadena comience con un número. Se ignora el espacio en blanco al principio de la cadena. Aquí hay un ejemplo de cómo hacer algo diferente de lo que desea y no dar ninguna indicación de que algo salió mal:

const widgetsSold = parseInt("97,800", 10); // widgetsSold is now 97

Es una buena práctica especificar siempre la base como segundo argumento. En navegadores más antiguos, si la cadena comenzaba con 0, se interpretaría como octal si no se especificaba la base, lo que tomó a mucha gente por sorpresa. El comportamiento para hexadecimal se activa al hacer que la cadena comience con 0x si no se especifica ninguna base, por ejemplo, 0xff. En realidad, el estándar cambió con ECMAScript 5 , por lo que los navegadores modernos ya no activan octal cuando hay un 0 inicial si no se ha especificado ninguna base. parseInt comprende bases hasta la base 36, en cuyo caso tanto las letras mayúsculas como las minúsculas se tratan como equivalentes.

Cambiar el tipo de una cadena a un número

Todos los demás trucos mencionados anteriormente que no utilizan parseInt implican convertir implícitamente la cadena en un número. Prefiero hacer esto explícitamente,

var cast = Number("97");

Esto tiene un comportamiento diferente al de los métodos de análisis (aunque todavía ignora los espacios en blanco). Es más estricto: si no comprende la cadena completa, devuelve NaN, por lo que no puedes usarlo para cadenas como 97px. Dado que desea un número primitivo en lugar de un objeto contenedor Número, asegúrese de no colocarlo newdelante de la función Número.

Obviamente, convertir a Número le da un valor que podría ser un flotante en lugar de un número entero, por lo que si desea un número entero, debe modificarlo. Hay algunas formas de hacer esto:

var rounded = Math.floor(Number("97.654"));  // other options are Math.ceil, Math.round
var fixed = Number("97.654").toFixed(0); // rounded rather than truncated
var bitwised = Number("97.654")|0;  // do not use for large numbers

Cualquier operador bit a bit (aquí he hecho un bit a bit o, pero también puedes hacer una doble negación como en una respuesta anterior o un desplazamiento de bits) convertirá el valor a un entero de 32 bits, y la mayoría de ellos se convertirá a un entero con signo. . Tenga en cuenta que esto no funcionará para números enteros grandes . Si el número entero no se puede representar en 32 bits, se ajustará.

~~"3000000000.654" === -1294967296
// This is the same as
Number("3000000000.654")|0
"3000000000.654" >>> 0 === 3000000000 // unsigned right shift gives you an extra bit
"300000000000.654" >>> 0 === 3647256576 // but still fails with larger numbers

Para trabajar correctamente con números mayores, debes utilizar los métodos de redondeo.

Math.floor("3000000000.654") === 3000000000
// This is the same as
Math.floor(Number("3000000000.654"))

Tenga en cuenta que la coerción entiende la notación exponencial y el Infinito, por lo que 2e2lo es 200en lugar de NaN, mientras que los métodos de análisis no.

Costumbre

Es poco probable que alguno de estos métodos haga exactamente lo que desea. Por ejemplo, normalmente me gustaría que se generara un error si falla el análisis y no necesito soporte para Infinity, exponenciales o espacios en blanco iniciales. Dependiendo de su caso de uso, a veces tiene sentido escribir una función de conversión personalizada.

Siempre verifique que la salida de Número o uno de los métodos de análisis sea el tipo de número que espera. Es casi seguro que querrás usarlo isNaNpara asegurarte de que el número no sea NaN (normalmente es la única forma de saber que el análisis falló).

kybernetikos avatar Dec 11 '2013 07:12 kybernetikos

Lo más rápido

var x = "1000"*1;

Prueba

Aquí hay una pequeña comparación de velocidad (solo macOS)... :)

Para Chrome, 'plus' y 'mul' son los más rápidos (>700.000,00 op/seg), 'Math.floor' es el más lento. Para Firefox, 'plus' es el más lento (!) 'mul' es el más rápido (>900.000.000 op/seg). En Safari, 'parseInt' es el más rápido, 'número' es el más lento (pero los resultados son bastante similares, >13.000.000 <31.000.000). Por lo tanto, Safari para transmitir cadenas a int es más de 10 veces más lento que otros navegadores. Entonces el ganador es ' mul ' :)

Puede ejecutarlo en su navegador mediante este enlace https://jsperf.com/js-cast-str-to-number/1

Ingrese la descripción de la imagen aquí

También probé var x = ~~"1000";. En Chrome y Safari, es un poco más lento que var x = "1000"*1(<1%), y en Firefox es un poco más rápido (<1%).

Kamil Kiełczewski avatar Mar 27 '2017 21:03 Kamil Kiełczewski