Pregunta ¿Cómo convierto una cadena en un entero en JavaScript?


¿Cómo convierto un string en una integer en JavaScript?


1372
2017-07-15 20:22


origen


Respuestas:


La forma más simple sería usar el nativo Number función:

var x = Number("1000")

Si eso no funciona para ti, entonces están los parseInt, unario plus, ParseFloat con pisoy Math.round métodos.

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])

unario plus si su cadena ya está en forma de un entero:

var x = +"1000";

si su cadena es o podría ser un flotador 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");

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

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

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

var round = Math.round;
var x = round("1000"); //equivalent to round("1000",0)

1747
2017-07-15 20:28



Prueba la función parseInt:

var number = parseInt("10");

Pero hay un problema. Si intenta convertir "010" usando la función parseInt, detectará como número octal, y devolverá el número 8. Por lo tanto, debe especificar un radix (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

192
2017-07-15 20:23



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

Parsing

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

parseInt y parseFloat son las dos funciones que se utilizan para analizar cadenas a números. El análisis se detendrá silenciosamente si golpea a un personaje 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 en la entrada incorrecta, en su lugar Recuperaré NaN a menos que la cadena comience con un número. El espacio en blanco al comienzo de la cadena se ignora. Aquí hay un ejemplo de cómo hace algo diferente a lo que desea y no da ninguna indicación de que algo haya salido mal:

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

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

Cambiar el tipo de cadena a un número

Todos los otros trucos mencionados anteriormente que no usan parseInt implican forzar implícitamente la cadena en un número. Prefiero hacer esto explícitamente,

var cast = Number("97");

Esto tiene un comportamiento diferente a los métodos de análisis (aunque todavía ignora el espacio en blanco). Es más estricto: si no comprende toda la cadena de lo que 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 de número, asegúrese de no poner new frente a la función Número.

Obviamente, la conversión a un número le da un valor que podría ser un valor flotante en lugar de un número entero, por lo que si desea un número entero, debe modificarlo. Hay algunas maneras 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 bitwise o, pero también puedes hacer una doble negación como en una respuesta anterior o un cambio de bits) convertirá el valor en un entero de 32 bits, y la mayoría de ellos se convertirá en un entero con signo. Tenga en cuenta que esto no va a querer quiere que desee enteros grandes. Si el 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 más grandes, debe usar los métodos de redondeo

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

Tenga en cuenta que todos estos métodos entienden la notación exponencial, por lo que 2e2 es 200 en lugar de NaN. Además, Number entiende "Infinity", mientras que los métodos de análisis no.

Personalizado

Es poco probable que ninguno de estos métodos haga exactamente lo que usted desea. Por ejemplo, generalmente quisiera lanzar un error si el análisis fracasa, y no necesito soporte para Infinity, exponentials o leading whitespace. Según su caso de uso, a veces tiene sentido escribir una función de conversión personalizada.

Siempre verifique que la salida del Número o uno de los métodos de análisis sea el tipo de número que espera. Es casi seguro que querrá usar isNaN para asegurarse de que el número no sea NaN (por lo general, la única forma en que descubre que el análisis falló).


107
2017-12-11 07:47



ParseInt () y + son diferentes

parseInt("10.3456") // returns 10

+"10.3456" // returns 10.3456

50
2018-03-14 09:54



Aunque es una vieja pregunta, pero tal vez esto puede ser útil para alguien.

Yo uso esta forma de convertir cadenas a En t número

var str = "25";       // string
var number = str*1;   // number

Por lo tanto, al multiplicar por 1, el valor no cambia, pero js devuelve automáticamente un número.

Pero como se muestra a continuación, esto debe usarse si está seguro de que el str es un número (o puede representarse como un número); de lo contrario, devolverá NaN, no un número.

puedes crear una función simple para usar, p.

function toNumber(str) {
   return str*1;
}

enter image description here


35
2018-03-16 18:24



Prueba parseInt.

var number = parseInt("10", 10); //number will have value of 10.

31
2017-07-15 20:23



Publiqué la respuesta incorrecta aquí, lo siento. fijo.

Esta es una vieja pregunta, pero me encanta este truco:

~~"2.123"; //2
~~"5"; //5

El doble bit negativo arroja algo después del punto decimal Y lo convierte a formato numérico. Me han dicho que es un poco más rápido que llamar funciones y otras cosas, pero no estoy del todo convencido.

EDITAR: Otro método que acabo de ver aquí (una pregunta sobre el operador javascript >>>, que es un desplazamiento a la derecha con cero relleno) que muestra que al cambiar un número por 0 con este operador, el número se convierte en uint32 lo cual es bueno si también lo quieres no firmado. Nuevamente, esto se convierte en entero sin signo, lo que puede llevar a comportamientos extraños si usa un número firmado.

"-2.123" >>> 0; // 4294967294
"2.123" >>> 0; // 2
"-5" >>> 0; // 4294967291
"5" >>> 0; // 5

25
2018-01-16 09:51



¡Cuidado si usas parseInt para convertir un flotador en notación científica! Por ejemplo:

parseInt("5.6e-14") 

resultará en

5 

en lugar de

0

18
2017-07-01 06:48



También como nota al margen: Mootools tiene la función toInt () que se usa en cualquier cadena nativa (o float (o integer)).

"2".toInt()   // 2
"2px".toInt() // 2
2.toInt()     // 2

16
2017-07-16 20:05



Aquí hay poca comparación de velocidad (solo Mac OS) ... :)

Para chrome 'plus' y 'mul' son los más rápidos, 'Math.floor' es el más lento (> 700,000,00 op / sec). Para Firefox 'plus' es el más lento (!) 'Mul' es el más rápido (> 900,000,000 op / sec). En Safari 'parseInt' es rápido, 'number' es más lento (pero los resulados son bastante similares,> 13,000,000 <31,000,000). Entonces Safari para la cadena de lanzamiento 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/casttonumber

enter image description here


16
2018-03-27 21:42



Por favor, mira el siguiente ejemplo. Te ayudará a aclarar tu duda

Example                  Result

parseInt("4")            4
parseInt("5aaa")         5
parseInt("4.33333")      4
parseInt("aaa");         NaN (means "Not a Number")

mediante el uso de la función parseint. Solo dará el op del número entero presente y no la cadena.


14
2017-11-27 12:43