Probably a silly question, but in python is there a simple way to automatically pad a number with zeros to a fixed length? I wasn't able to find this in the python docs, but I may not have been looking hard enough? e.i. I want bin(4) to return 00100, rather than just 100. Is there a simple way to ensure the output will be six bits instead of three?
3 Answers
Strings have a .zfill() method to pad it with zeros:
>>> '100'.zfill(5)
'00100'
For binary numbers however, I'd use string formatting:
>>> '{0:05b}'.format(4)
'00100'
The :05b formatting specification formats the number passed in as binary, with 5 digits, zero padded. See the Python format string syntax. I've used str.format() here, but the built-in format() function can take the same formatting instruction, minus the {0:..} placeholder syntax:
>>> format(4, '05b')
'00100'
if you find that easier.
9 Comments
Slater Victoroff
Ah, fantastic! Just what I was looking for. Bonus points for including both solutions, which is why once this one is accepted over others.
jfs
Martijn Pieters
@J.F.Sebastian: I see no measurements for
format(), only str.format(). str.format() requires a parsing step, then filling the slots, which internally then uses format(). To compare with bin/zfill, you need to not incur that extra cost.jfs
@MartijnPieters: yes. My older comment uses
"".format that hints at that. Though I don't know what is "fair" translation of: "{:0{}b}".format(n, len(data)*8) (it is compared against bin(n)[2:].zfill(len(data)*8)) using only format() e.g., format(n, "0%db" % (len(data)*8)) has performed worse.Martijn Pieters
@J.F.Sebastian: The length cannot be pre-computed? Why not compare
bin()/zfill() and format() with a fixed length? |
try this...
In [11]: x = 1
In [12]: print str(x).zfill(5)
00001
In [13]: bin(4)
Out[13]: '0b100'
In [14]: str(bin(4)[2:]).zfill(5)
Out[14]: '00100'
1 Comment
ApproachingDarknessFish
+1 for using [2:] to strip the '0b' off the binary literal. that caught me at first.