# How do I pad numbers to the left so that all are the same length?

I have a list of numbers like

{-6, 1, 3, 23}


and want to get a list of strings, all of the same length, with zeros padding on the left as needed, like

{"-6", "01", "03", "23"}


The closest I can get following the documentation is with something like

NumberForm[{-6, 1, 3, 23}, 1, NumberPadding -> {"0", ""}]


which (astonishingly) produces

{"-6", "01", "03", "023"}


How I can simply get my strings to all be the same length, padded as needed with zeros?

• What do you desire for the first entry: "-06" or "0-6" or "-006"? – David G. Stork Mar 3 '15 at 18:24
• @DavidG.Stork: "-6", as indicated: all the same length. – orome Mar 3 '15 at 18:26
• Oh... it was unclear whether you wanted all strings to have the length 3 (in this case)... as in "023". Let me work on this.... – David G. Stork Mar 3 '15 at 18:29
• IntegerString may come in handy. – Yves Klett Mar 3 '15 at 18:41
• @DavidG.Stork: Just like the example. Never more than one digit negative numbers and never more than two digit positives. – orome Mar 3 '15 at 18:51

As of 10.1 this is built in to Mathematica with StringPadLeft:

StringPadLeft[#,2,"0"]&@*ToString/@{-6,1,3,23}


{"-6", "01", "03", "23"}

• Could you please elucidate on the meaning of &@*? – Oscillon Sep 15 '19 at 1:41
• @Oscillon Composition – orome Sep 15 '19 at 1:46
ClearAll[nF]
nF = With[{l = #, p = #2}, NumberForm[l, p, SignPadding -> True, NumberPadding -> {"0", ""},
NumberFormat -> (StringTake[#1, -(p + 1)] &)]] &;

nF[{-6, 1, 3, 23}, 1]
(* {-6, 01, 03, 23} *)

nF[{-6, 1, 3, 23, 123}, 2]
(* {-06, 001, 003, 023, 123} *)


Note: You can also use PaddedForm instead of NumberForm.

StringTake["0" <> ToString[#], -2] & /@ {-6, 1, 3, 23}


One way:

If[StringLength@# == 1, "0" <> #, #] &@*ToString /@ {-6, 1, 3, 23}


Another way:

StringJoin@*(ToString /@ PadLeft[#, 2] &)@*Characters@*ToString /@ {-6, 1, 3, 23}

• So there's no built-in way to do this? Any idea what the reasoning behind the way NumberForm works could possibly be? I really don't understand the philosophy behind the Mathematica language design (c.f.: [str(n).zfill(2) for n in numbers]). – orome Mar 3 '15 at 18:42
• @raxacoricofallapatorius Take a look at the newest solution. There is a built in function, but in order to use it we must first convert our string into a list. – C. E. Mar 3 '15 at 18:52
• So the second solution is incomplete. – orome Mar 3 '15 at 18:58
• @raxacoricofallapatorius Argh, I forgot to convert it back into a string. Now it's less elegant; I'd go with the first option. I'd go with it anyway because it's easy to understand; if you look at it in 6 months you will still know what it does. – C. E. Mar 3 '15 at 19:00
• Thanks. That works. I'm still puzzled what (if any) design philosophy could have lead to this sort of thing. [str(n).zfill(2) for n in numbers] is not only something I'll understand in 6 months, but something that I can remember to recreate in 6 months (or years). – orome Mar 3 '15 at 19:05

just for fun..we can define a zfill function

 zfill[n_, f_String: "0"] :=
Function[{s},
StringJoin[ConstantArray[f, Max[0, n - StringLength[s]]], s]];


then the operation is quite similar to your python expression:

 zfill[2] /@ ToString /@ {-6, 1, 3, 23}


{"-6", "01", "03", "23"}

• I find this a good one! – Santi Mar 19 '15 at 10:32