Reputation: 28364
Defaulting the radix to 8 (if the string starts with a 0) in JavaScript's parseInt function annoys me, only because I continue to forgot to pass the optional second argument as 10. I'm looking for an answer telling me why it makes sense to have it default to 8.
Upvotes: 23
Views: 13910
Reputation: 5731
Now, a couple of years later, parseInt()
seems to work fine with numbers starting with 0
. Current browsers:
parseInt("019"); // 19 on Firefox 67
parseInt("019"); // 19 on Chrome 75
parseInt("019"); // 19 on Safari 12
parseInt("019"); // 19 on IE 11
parseInt("019"); // 19 on Edge 42
But still, this "fix" must break older scripts that rely on parseInt("019")
returning 1
or 0
instead of 19
...
Upvotes: 6
Reputation: 359836
It only "defaults" to 8 if the input string starts with 0. This is an unfortunate carryover from C and C++.
You can use Number('0123')
instead, or, as you said in the question, parseInt('0123', 10)
.
How do I work around JavaScript's parseInt octal behavior?
Can you tell me more about this carryover?
Note: ECMAScript strict mode removes octal syntax.
Upvotes: 34
Reputation: 66425
If a number starts with 0
and contains digits between (and inclusive) 0 to 7, it is interpreted as an octal number (with base 8 instead of 10).
In parseInt however, if a string starts with a 0
it's always interpeted as an octal, and stops searching when it encounters an invalid character (e.g. the digits 8
or 9
or a character like z
).
parseInt("070"); //56
parseInt("70"); //70
parseInt("070", 10); //70
parseInt("78"); //78
parseInt("078"); //7, because it stops before 8
If you need to convert a string into a number, and you're sure that it contains no invalid characters or fractional parts, you can multiply it with 1 to make a number of it:
1 * "070"; //70
I personally prefer this approach, and believe it's faster than calling functions.
Upvotes: 9