2011-04-08 10 views

Respuesta

17

Solo se "predetermina" a 8 si la cadena de entrada comienza con 0. Esto es un desafortunado remanente de C y C++.

En su lugar, puede usar Number('0123') o, como dijo en la pregunta, parseInt('0123', 10).

How do I work around JavaScript's parseInt octal behavior?


¿Me puede decir más acerca de este remanente?


Nota: ECMAScript strict mode removes octal syntax.

+0

¿Puede decirme más sobre este arrastre? –

+0

Sí. Es estúpido, malvado, malo y desagradable, una "característica" mal diseñada implementada únicamente porque los idiomas anteriores lo hicieron. –

+2

Un unario '+' es una mejor opción que utilizar 'Number'. Unario '+' ignora los formatos octales (pero sigue respetando los formatos hexadecimales) y es más rápido que una llamada a función. – Reid

5

Si un número comienza con 0 y contiene dígitos entre (e inclusive) 0 a 7, se interpreta como un número octal (con base 8 en lugar de 10).

En parseInt Sin embargo, si una cadena comienza con un 0 Siempre es interpeted como octal, y la búsqueda se detiene cuando encuentra un carácter no válido (por ejemplo, los dígitos o 89 o un personaje como z).

parseInt("070");  //56 
parseInt("70");  //70 
parseInt("070", 10); //70 
parseInt("78");  //78 
parseInt("078");  //7, because it stops before 8 

Si usted necesita para convertir una cadena en un número, y está seguro de que no contiene caracteres no válidos o partes fraccionarias, se puede multiplicar con 1 para hacer una serie de ella:

1 * "070";   //70 

Personalmente prefiero este enfoque, y creo que es más rápido que llamar a funciones.

+0

Al menos en Chrome, 'parseInt' no es tan inteligente. 'parseInt ('019')' devuelve '1', y' parseInt ('09') 'devuelve 0. Ouch. –

+2

Para aquellos que no entienden de lo que Matt Ball está hablando, la primera respuesta presentada contenía el primer párrafo solamente. – Lekensteyn

Cuestiones relacionadas