Mostrar número con ceros a la izquierda

912

Dado:

a = 1
b = 10
c = 100

¿Cómo visualizo un cero inicial para todos los números con menos de dos dígitos?

Esta es la salida que espero:

01
10
100
ashchristopher
fuente

Respuestas:

1061

En Python 2 (y Python 3) puedes hacer:

print "%02d" % (1,)

Básicamente % es como printfo sprintf(ver documentos ).


Para Python 3. +, el mismo comportamiento también se puede lograr con format:

print("{:02d}".format(1))

Para Python 3.6+, se puede lograr el mismo comportamiento con las cadenas f :

print(f"{1:02d}")
Jack M.
fuente
8
Ejemplo: imprima el resultado "% 05d"% ['postalCode'] para un código postal de 5 dígitos.
Nick Woodhams
2
x = "%02d.txt" % iplantea TypeError (no puede concatenar objetos 'str' e 'int'), pero x = "%02d.txt" % (i,)no lo hace. Interesante. Me pregunto dónde está documentado
theta
@theta En 2.7.6, no recibo un error. ¿Tal vez esto fue un error en una versión específica de Python que ya han solucionado?
Jack M.
1
Tal vez. En 2.7.6 no hay excepción si el valor del formato no es tupla (al menos para este ejemplo). Mirando la fecha de mi comentario, supongo que estaba ejecutando 2.7.3 en ese entonces, y en ese momento no sabía que poner una sola variable en una tupla lo coloca en un lugar seguro mientras usa el %formateador de cuerdas.
theta
1
Para elaborar, los documentos explican esto aquí: "Cuando no se proporciona una alineación explícita, el campo de ancho precedido por un carácter cero ('0') habilita el relleno de cero con reconocimiento de signos para los tipos numéricos. Esto es equivalente a un carácter de relleno de ' 0 'con un tipo de alineación de' = '. "
JHS
940

Puedes usar str.zfill:

print(str(1).zfill(2))
print(str(10).zfill(2))
print(str(100).zfill(2))

huellas dactilares:

01
10
100
Datageek
fuente
71
Me gusta esta solución, ya que ayuda no solo al generar el número, sino también cuando necesita asignarlo a una variable ... por ejemplo, x = str (datetime.date.today (). Month) .zfill (2) devolverá x como '02' para el mes de feb.
EroSan
2
Esta debería ser la respuesta correcta, ya "{1:02d}"que no puede tener variables en lugar de 2(como si está creando una función dinámica).
Joshua Varghese
363

En Python 2.6+ y 3.0+, usaría el format()método de cadena:

for i in (1, 10, 100):
    print('{num:02d}'.format(num=i))

o usando el incorporado (para un solo número):

print(format(i, '02d'))

Consulte la documentación de PEP-3101 para conocer las nuevas funciones de formateo.

Ber
fuente
29
Funciona en Python 2.7.5 también. También puede usar '{: 02d}'. Format (1) si no desea usar argumentos con nombre.
Jason Martens
1
Funciona bien en 2.7.2, con un punto flotante "{0: 04.0f}". El formato (1.1) da 0001 (: 04 = al menos 4 caracteres, en este caso los 0 iniciales, .0f = punto flotante sin decimales) . Soy consciente del formato% pero quería modificar una instrucción .format existente sin tener que volver a escribir todo . ¡Gracias!
Michael Stimson
129
print('{:02}'.format(1))
print('{:02}'.format(10))
print('{:02}'.format(100))

huellas dactilares:

01
10
100
Kresimir
fuente
1
De esta forma, puede repetir el argumento varias veces dentro de la cadena:One zero:{0:02}, two zeros: {0:03}, ninezeros: {0:010}'.format(6)
srodriguex
2
Solo compatible con Python 3. Si usa Python 2.7, hágaloprint '{:02}'.format(1)
Blairg23
89

O esto:

print '{0:02d}'.format(1)

ajd
fuente
73

En Python> = 3.6 , puede hacer esto sucintamente con las nuevas cadenas f que se introdujeron utilizando:

f'{val:02}'

que imprime la variable con nombre valcon un fillvalor de 0y a widthde 2.

Para su ejemplo específico, puede hacerlo muy bien en un bucle:

a, b, c = 1, 10, 100
for val in [a, b, c]:
    print(f'{val:02}')

que imprime:

01 
10
100

Para obtener más información sobre las cadenas f, eche un vistazo a PEP 498 donde se introdujeron.

Dimitris Fasarakis Hilliard
fuente
56
x = [1, 10, 100]
for i in x:
    print '%02d' % i

resultados en:

01
10
100

Lea más información sobre el formato de cadenas usando% en la documentación.

nosklo
fuente
99
El ejemplo de documentación apesta. Lanzan el mapeo con la muestra cero inicial, por lo que es difícil saber cuál es cuál a menos que ya sepa cómo funciona. Eso es lo que me trajo aquí, en realidad.
Grant
49

La forma pitónica de hacer esto:

str(number).rjust(string_width, fill_char)

De esta forma, la cadena original se devuelve sin cambios si su longitud es mayor que string_width. Ejemplo:

a = [1, 10, 100]
for num in a:
    print str(num).rjust(2, '0')

Resultados:

01
10
100
Zulú
fuente
33

U otra solución.

"{:0>2}".format(number)
InviernoChilly
fuente
3
Esta sería la forma de Python, aunque me gustaría incluir el parámetro para mayor claridad - "{0:0>2}".format(number), si alguien quiere nLeadingZeros voluntad que deben tener en cuenta que también puede hacer:"{0:0>{1}}".format(number, nLeadingZeros + 1)
Jonathan Allan
4

Así es como lo hago:

str(1).zfill(len(str(total)))

Básicamente, zfill toma el número de ceros iniciales que desea agregar, por lo que es fácil tomar el número más grande, convertirlo en una cadena y obtener la longitud, de esta manera:

Python 3.6.5 (predeterminado, 11 de mayo de 2018, 04:00:52) 
[CCG 8.1.0] en Linux
Escriba "ayuda", "derechos de autor", "créditos" o "licencia" para obtener más información.
>>> total = 100
>>> print (str (1) .zfill (len (str (total))))
001
>>> total = 1000
>>> print (str (1) .zfill (len (str (total))))
0001
>>> total = 10000
>>> print (str (1) .zfill (len (str (total))))
00001
>>> 
Roberto
fuente
¿No contradice esto la respuesta de Datageek ?
Peter Mortensen
1
width = 5
num = 3
formatted = (width - len(str(num))) * "0" + str(num)
print formatted
nvd
fuente
1

Puedes hacer esto con cadenas f .

import numpy as np

print(f'{np.random.choice([1, 124, 13566]):0>8}')

Esto imprimirá una longitud constante de 8 y rellenará el resto con el interlineado 0.

00000001
00000124
00013566
Nicolas Gervais
fuente
0

Utilizar:

'00'[len(str(i)):] + str(i)

O con el mathmódulo:

import math
'00'[math.ceil(math.log(i, 10)):] + str(i)
Linekio
fuente
-2

Si se trata de números que tienen uno o dos dígitos:

'0'+str(number)[-2:] o '0{0}'.format(number)[-2:]

Knowbody
fuente