¿Cómo soluciono el comportamiento octal parseInt de JavaScript?

Resuelto Portman asked hace 15 años • 10 respuestas

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 .

Portman avatar May 12 '09 05:05 Portman
Aceptado

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
Paolo Bergantino avatar May 11 '2009 22:05 Paolo Bergantino

Si sabe que su valor estará en el rango de enteros de 32 bits con signo, ~~xhará 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 NaNlos valores a cero.

Sí, esto es increíblemente hack pero es muy conveniente...

Karl Guertin avatar Jan 05 '2010 14:01 Karl Guertin

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.

Portman avatar May 11 '2009 22:05 Portman
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.

Jason S avatar May 11 '2009 22:05 Jason S