¿Cómo soluciono el comportamiento octal parseInt de JavaScript?
Intente ejecutar lo siguiente en JavaScript:
parseInt('01'); //equals 1
parseInt('02'); //equals 2
parseInt('03'); //equals 3
parseInt('04'); //equals 4
parseInt('05'); //equals 5
parseInt('06'); //equals 6
parseInt('07'); //equals 7
parseInt('08'); //equals 0 !!
parseInt('09'); //equals 0 !!
Acabo de aprender por las malas que JavaScript cree que el cero inicial indica un número entero octal y, como no hay "8"
o "9"
en base 8, la función devuelve cero. Nos guste o no, esto es por diseño .
¿Cuáles son las soluciones?
Nota: Para completar, estoy a punto de publicar una solución, pero es una solución que odio, así que publique otras o mejores respuestas.
Actualizar:
La quinta edición del estándar JavaScript ( ECMA-262 ) introduce un cambio importante que elimina este comportamiento. Mozilla tiene una buena reseña .
Este es un problema común de Javascript con una solución simple:
Simplemente especifique la base o 'base', así:
parseInt('08',10); // 8
También puedes usar Número :
Number('08'); // 8
Si sabe que su valor estará en el rango de enteros de 32 bits con signo, ~~x
hará lo correcto en todos los escenarios.
~~"08" === 8
~~"foobar" === 0
~~(1.99) === 1
~~(-1.99) === -1
Si busca binario no ( ~
), la especificación requiere una conversión "ToInt32" para el argumento que realiza la conversión obvia a Int32 y se especifica para forzar NaN
los valores a cero.
Sí, esto es increíblemente hack pero es muy conveniente...
De la documentación de parseInt , use el argumento radix opcional para especificar base-10:
parseInt('08', 10); //equals 8
parseInt('09', 10); //equals 9
Esto me parece pedante, confuso y detallado (en realidad, ¿un argumento adicional en cada parseInt?), así que espero que haya una mejor manera.
function parseDecimal(s) { return parseInt(s, 10); }
editar: crear tu propia función, para hacer lo que realmente quieres, es solo una opción si no te gusta agregar ",10" todo el tiempo a la llamada parseInt(). Tiene la desventaja de ser una función no estándar: más conveniente para usted si la usa mucho, pero quizás más confusa para otros.