with parse number float javascript integer octal

number - ¿Cómo trabajo con el comportamiento octal de parseInt de JavaScript?



parseint java (9)

También puede, en lugar de usar parseFloat o parseInt, usar el operador unario ( + ).

+"01" // => 1 +"02" // => 2 +"03" // => 3 +"04" // => 4 +"05" // => 5 +"06" // => 6 +"07" // => 7 +"08" // => 8 +"09" // => 9

y en buena medida

+"09.09" // => 9.09

Enlace MDN

El operador unario plus precede a su operando y evalúa a su operando, pero intenta convertirlo en un número, si no lo está ya. Aunque la negación unaria (-) también puede convertir los no números, unary plus es la forma más rápida y preferida de convertir algo en un número , porque no realiza ninguna otra operación en el número.

Intenta 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 enterarme de la manera difícil en que JavaScript piensa que el cero inicial indica un entero octal , y como no hay "8" o "9" en la base 8, la función devuelve cero. Te guste o no, esto es por diseño .

¿Cuáles son las soluciones?

Nota: En aras de la integridad, estoy a punto de publicar una solución, pero es una solución que odio, así que publique otras / mejores respuestas.

Actualizar:

La 5ª edición del estándar de JavaScript ( ECMA-262 ) introduce un cambio de ruptura que elimina este comportamiento. Mozilla tiene una buena write-up .


¿Qué tal esto para decimal?

(''09''-0) === 9 // true (''009''-0) === 9 // true


¿Sería muy malo reemplazar ParseInt con una versión que asume decimal si no tiene un segundo parámetro? (nota - no probado)

parseIntImpl = parseInt parseInt = function(str, base){return parseIntImpl(str, base ? base : 10)}


Desde la documentación de parseInt , use el argumento de radix opcional para especificar base-10:

parseInt(''08'', 10); //equals 8 parseInt(''09'', 10); //equals 9

Esto me parece pedante, confuso y verboso (en realidad, ¿un argumento adicional en cada artículo?), Así que espero que haya una mejor manera.


Especifique la base:

var number = parseInt(s, 10);


Este es un JavaScript común con una solución simple:

Simplemente especifique la base , o ''radix'', así:

parseInt(''08'',10); // 8

También puedes usar Number :

Number(''08''); // 8


Si sabe que su valor estará en el rango entero de 32 bits con signo, entonces ~~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 un Int32 y se especifica para forzar los valores de NaN a cero.

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


Si ya has hecho un montón de codificación con parseInt y no quieres agregar ", 10" a todo, puedes anular la función para hacer que la base 10 sea la predeterminada:

window._oldParseInt = window.parseInt; window.parseInt = function(str, rad) { if (! rad) { return _oldParseInt(str, 10); } return _oldParseInt(str, rad); };

Eso puede confundir a un lector posterior, por lo que hacer una función parseInt10 () podría ser más autoexplicativo. Personalmente prefiero usar una función simple que tener que agregar ", 10" todo el tiempo, solo crea más oportunidades para cometer errores.


function parseDecimal(s) { return parseInt(s, 10); }

editar: crear su propia función, hacer lo que realmente desea, es solo una opción si no le gusta agregar el ", 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 confuso para los demás.