97

Say I wanted to display the number 123 with a variable number of padded zeroes on the front.

For example, if I wanted to display it in 5 digits I would have digits = 5 giving me:

00123

If I wanted to display it in 6 digits I would have digits = 6 giving:

000123

How would I do this in Python?

0

7 Answers 7

220

If you are using it in a formatted string with the format() method which is preferred over the older style ''% formatting

>>> 'One hundred and twenty three with three leading zeros {0:06}.'.format(123)
'One hundred and twenty three with three leading zeros 000123.'

See
http://docs.python.org/library/stdtypes.html#str.format
http://docs.python.org/library/string.html#formatstrings

Here is an example with variable width

>>> '{num:0{width}}'.format(num=123, width=6)
'000123'

You can even specify the fill char as a variable

>>> '{num:{fill}{width}}'.format(num=123, fill='0', width=6)
'000123'
Sign up to request clarification or add additional context in comments.

4 Comments

+1 for mentioning the new format method. It's taking a bit to get used to, but I actually feel it's a bit cleaner than the old % style, which feels ironic to me because I used to feel that the % style was the cleanest method.
Unnamed placefolders are also supported (at least in Python 3.4): "{:{}{}}".format(123, 0, 6).
@CoDEmanX The unnamed placeholders also work in python 2.7 - thanks.
With the introduction of f-strings in Python 3.6, it is now possible to access previously defined variables without the need for .format. Simply prepend an f to the string: f'{num:{fill}{width}}'. I added an answer with this info.
45

There is a string method called zfill:

>>> '12344'.zfill(10)
0000012344

It will pad the left side of the string with zeros to make the string length N (10 in this case).

1 Comment

This is exactly what I'm looking for, I just do '123'.zfill(m) which allows me to use a variable instead of having a predetermined number of digits. Thanks!
38

With the introduction of formatted string literals ("f-strings" for short) in Python 3.6, it is now possible to access previously defined variables with a briefer syntax:

>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'

The examples given by John La Rooy can be written as

In [1]: num=123
   ...: fill='0'
   ...: width=6
   ...: f'{num:{fill}{width}}'

Out[1]: '000123'

Comments

29
'%0*d' % (5, 123)

4 Comments

This is also quite useful for more general cases. This is the old style of formatting isn't it? It's a shame that the old style is being phased out
What does * in %0*d mean? I check Python documents. * is not in the format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type].
@Ignacio Vazquez-Abrams is it possible with new-style formatting also?
18

For those who want to do the same thing with python 3.6+ and f-Strings this is the solution.

width = 20
py, vg = "Python", "Very Good"
print(f"{py:>{width}s} : {vg:>{width}s}")

3 Comments

What is the s?
s means incoming var is to be treated as string
For a pre-specified number of digits, one can use f"{var:03d} where 03 determines the total width (3) with zero padding (0).
4
print "%03d" % (43)

Prints

043

Comments

1

Use string formatting

print '%(#)03d' % {'#': 2}
002
print '%(#)06d' % {'#': 123}
000123

More info here: link text

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.