4

I'm passing as parameter an id to a javascript function, because it comes from UI, it's left zero padded. but it seems to have (maybe) "strange" behaviour?

    console.log(0000020948);  //20948
    console.log(0000022115);   //9293 which is 22115's octal 
    console.log(parseInt(0000022115, 10));  // 9293 which is 22115's octal
    console.log(0000033959);  //33959
    console.log(20948);  //20948
    console.log(22115); //22115
    console.log(33959); //33959

how can I make sure they are parsing to right numebr they are? (decimal)

EDIT:

just make it clearer:

those numbers come from the server and are zero padded strings. and I'm making a delete button for each one.

like:

function printDelButton(value){
          console.log(typeof value);  //output string 
  return '<a href="#" onclick="deleteme('+value+')"><img src="images/del.png"></a>'
}

and 

function printDelButton(value){
console.log(typeof value); //output numeric
    console.log(value);   //here output as octal .... :S
 }

I tried :

console.log(parseInt(0000022115, 10));  // 9293 which is 22115's octal

and still parsing as Octal

Kamil Kiełczewski
  • 85,173
  • 29
  • 368
  • 345
Yichz
  • 9,250
  • 10
  • 54
  • 92
  • Instead of padding your numbers using zeros, use spaces. – Rob W Jan 30 '12 at 22:25
  • Why does the UI left pad it with 0s? – jglouie Jan 30 '12 at 22:26
  • It may be a good idea to use a `"use strict"` directive in your script. That will cause any use of octal literals to throw an error and it should make things easier to debug! – James Allardice Jan 30 '12 at 22:27
  • they come from server as string with leading zeros, and I just throw it to an javascript function – Yichz Jan 30 '12 at 22:28
  • possible duplicate of [Workarounds for JavaScript parseInt octal bug](http://stackoverflow.com/questions/850341/workarounds-for-javascript-parseint-octal-bug) – Felix Kling Jan 30 '12 at 22:44
  • 3
    Regarding `parseInt(0000022115, 10)`: You are still passing a number as first parameter, which makes JavaScript convert the number *first* and then pass it to `parseInt`. Pass a string instead. – Felix Kling Jan 30 '12 at 22:46
  • 1
    If you're creating a new element from the `''` string, then you need to wrap the `value` part of the string in quotes. `''` –  Jan 30 '12 at 22:53

6 Answers6

5

If you receive your parameters as string objects, it should work to use

 parseInt(string, 10)

to interpret strings as decimal, even if they are beginning with 0.

In your test, you pass the parseInt method a number, not a string, maybe that's why it doesn't return the expected result.

Try

 parseInt('0000022115', 10)

instead of

parseInt(0000022115, 10)

that does return 221115 for me.

Jan
  • 2,498
  • 1
  • 15
  • 6
4

If you start it with a 0, it's interpreted as an Octal number.

See http://www.hunlock.com/blogs/The_Complete_Javascript_Number_Reference#quickIDX2

Note the article's warning here:

You should never precede a number with a zero unless you are specifically looking for an octal conversion!

Consider looking here for ideas on removing the leadings 0s: Truncate leading zeros of a string in Javascript

Community
  • 1
  • 1
jglouie
  • 12,523
  • 6
  • 48
  • 65
1

Leading 0s indicate that the number is octal.

parseInt parses a string containing a number.
parseInt(0000022115, 10) passes a numeric literal. The literal is parsed in octal by the JS interpreter, so you're passing a raw numeric value to parseInt.

SLaks
  • 868,454
  • 176
  • 1,908
  • 1,964
0

If number came from server as zero padded string then use +"0000022115"

console.log(+"0000022115")

if (021 < 019) console.log('Paradox');

JS treat zero padded numbers like octal only if they are valid octal - if not then it treat it as decimal. To not allow paradox 'use strict' mode

'use strict'

if (021 < 019) console.log('Paradox');
Kamil Kiełczewski
  • 85,173
  • 29
  • 368
  • 345
0

Unless you can intercept a string version of this number, you're out of luck.

That being said, if you can get a string version of your octal (calling toString() won't help), this will work:

parseInt(variable_string.replace(/^0+/, ''), 10);
Blender
  • 289,723
  • 53
  • 439
  • 496
0

Try

/^[0]*([1-9]\d)/.exec(numberFromUI)[0]

That should give you just the numbers stripping the zeros (if you have to support decimals, you'll need to edit to account for the '.', and of course ',' is fun too... and I really hope you don't have to handle all the crazy different ways Europeans write numbers! )

Gus
  • 6,719
  • 6
  • 37
  • 58
  • No; just use `parseInt(str, 10)` or `parseFloat`. The problem is that he has a literal. – SLaks Jan 30 '12 at 22:33