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

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}")

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

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.


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

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


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.


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.


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

33

U otra solución.

"{:0>2}".format(number)

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
>>> 


1
width = 5
num = 3
formatted = (width - len(str(num))) * "0" + str(num)
print formatted

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

0

Utilizar:

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

O con el mathmódulo:

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


-2

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.