852

Is there a way to prepend leading zeros to numbers so that it results in a string of fixed length? For example, 5 becomes "05" if I specify 2 places.

11
  • 178
    I've found this wich I guess is far more simple: ("00" + h).slice (-3); Commented Jul 30, 2012 at 20:26
  • 12
    @PauloBueno ("00" + 1234).slice (-3); gives 234 i.e. discards the most significant figure. Commented Aug 14, 2012 at 8:05
  • 19
    @DanielEarwicker sure it does but you should adjust to the ammount of digits you are expecting. ("000" + 1234).slice(-4), ("0000" + 12345).slice(-5) and so on... Commented Aug 15, 2012 at 19:25
  • 3
    If you also want to limit the length of the number you could use this: return (num/Math.pow(10,size)).toFixed(size).split('.')[1]; Commented Feb 18, 2015 at 14:55
  • 29
    Now javascript supports padStart: (5).toString().padStart(3, "0"). Commented Feb 5, 2018 at 11:02

6 Answers 6

989

NOTE: Potentially outdated. ECMAScript 2017 includes String.prototype.padStart.

You'll have to convert the number to a string since numbers don't make sense with leading zeros. Something like this:

function pad(num, size) {
    num = num.toString();
    while (num.length < size) num = "0" + num;
    return num;
}

Or, if you know you'd never be using more than X number of zeros, this might be better. This assumes you'd never want more than 10 digits.

function pad(num, size) {
    var s = "000000000" + num;
    return s.substr(s.length-size);
}

If you care about negative numbers you'll have to strip the - and re-add it.

Sign up to request clarification or add additional context in comments.

15 Comments

Second function; shorter: function pad(num, size){ return ('000000000' + num).substr(-size); }
^ Negative values won't work in many versions of IE.
Ah, apparently slice() works with negative values in IE though :) stackoverflow.com/questions/2243824/…
figured it out: value = pad(value, 18); ==> always returns 18 characters, so if you add 10 zero's size should be 10.
substr() is considered deprecated, use substring() instead :)
|
688

UPDATE: Small one-liner function using the ES2017 String.prototype.padStart method:

const zeroPad = (num, places) => String(num).padStart(places, '0')

console.log(zeroPad(5, 2)); // "05"
console.log(zeroPad(5, 4)); // "0005"
console.log(zeroPad(5, 6)); // "000005"
console.log(zeroPad(1234, 2)); // "1234"

Another ES5 approach:

function zeroPad(num, places) {
  var zero = places - num.toString().length + 1;
  return Array(+(zero > 0 && zero)).join("0") + num;
}

zeroPad(5, 2); // "05"
zeroPad(5, 4); // "0005"
zeroPad(5, 6); // "000005"
zeroPad(1234, 2); // "1234" :)

6 Comments

You're not taking into account negative array sizes ;) eg zeroPad(1234, 2) -> RangeError: Invalid array length
According to this benchmark, this method is 5 times slower than the accepted solution: gist.github.com/4382935
I like the code, but it does seem to be slower in Chrome. Interested in seeing results from other browsers: jsperf.com/zero-padding-number-methods
For Node.js this is the best working solution. GJ
If you're slow like me the argument for num in the .padStart call is NOT the length to pad with but the maximum length to pad to. Important distinction.
|
269

You could extend the Number object:

Number.prototype.pad = function(size) {
    var s = String(this);
    while (s.length < (size || 2)) {s = "0" + s;}
    return s;
}

Examples:

(9).pad();  //returns "09"

(7).pad(3);  //returns "007"

9 Comments

I think this is just what I need. The argument 'size' refers to the FINAL character count and not the total number of zeros to add, right?
yeah, it does, it checks the total length and compares that.
Yeah, it depends on where you are using it. It is not inherently bad thing, but if used in a space with lots of third party involvement, potentially a risk with overwriting functionality.
(9).pad() and (7).pad(3) with parens!
The problem is not comparable to globals, nor does it have anything to do with IE6. The problem is perpetual. The fact that it was discovered years ago doesn’t make it go away. The problem is that the language itself evolves. Who’s to say your .pad() will work the same way as a native version, should it ever come along? I can’t find my original comment. Hopefully it’s just a bug in Stack Overflow. If it was deleted, that would be a poor reflection of the state of things around here.
|
70

From https://gist.github.com/1180489

function pad(a, b){
  return(1e15 + a + '').slice(-b);
}

With comments:

function pad(
  a, // the number to convert 
  b // number of resulting characters
){
  return (
    1e15 + a + // combine with large number
    "" // convert to string
  ).slice(-b) // cut leading "1"
}

5 Comments

This is good but it has a fatal flaw. For example, pad (1234, 3) === "234"! Which is obviously, unacceptable.
It's also broken if you want padding longer than 15. Elegant, but pretty inflexible.
@dave1010 I got a bad result pad(1234) yields "1000000000001234" . with parameter pad(1234,20) yields "1000000000001234" Thanks @Brock Adams
@JamesThomasMoon1979, see this answer. Not only does it work properly (while most other answers fail many test cases), it significantly outperforms the other approaches -- especially if you use the logarithmic variation linked in the comments.
@BrockAdams My test case is in my prior comment. It did not work properly. Tested on firefox 35 on Ubuntu.
15
function zfill(num, len) {return (Array(len).join("0") + num).slice(-len);}

3 Comments

When you post code select it and click on the {} button so it gets formatted as such.
zfill(1234, 3) === "234"
function zFill(n,l){return (l>n.toString().length)?((Array(l).join('0')+n).slice(-l)):n;}
5

Just for fun (I had some time to kill), a more sophisticated implementation which caches the zero-string:

pad.zeros = new Array(5).join('0');
function pad(num, len) {
    var str = String(num),
        diff = len - str.length;
    if(diff <= 0) return str;
    if(diff > pad.zeros.length)
        pad.zeros = new Array(diff + 1).join('0');
    return pad.zeros.substr(0, diff) + str;
}

If the padding count is large and the function is called often enough, it actually outperforms the other methods...

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.