Exibir número com zeros à esquerda

910

Dado:

a = 1
b = 10
c = 100

Como exibir um zero inicial para todos os números com menos de dois dígitos?

Esta é a saída que estou esperando:

01
10
100
ashchristopher
fonte

Respostas:

1059

No Python 2 (e Python 3), você pode fazer:

print "%02d" % (1,)

Basicamente, % é como printfou sprintf(consulte a documentação ).


Para Python 3. +, o mesmo comportamento também pode ser alcançado com format:

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

Para o Python 3.6+, o mesmo comportamento pode ser alcançado com as strings f :

print(f"{1:02d}")
Jack M.
fonte
8
Exemplo: imprima "% 05d"% result ['postalCode'] para um código postal de 5 dígitos.
precisa
2
x = "%02d.txt" % igera TypeError (não pode concatenar objetos 'str' e 'int'), mas x = "%02d.txt" % (i,)não o faz. Interessante. Gostaria de saber onde é que documentou
teta
@ theta No 2.7.6, não recebo um erro. Talvez tenha sido um bug em uma versão específica do Python que eles corrigiram desde então?
Jack M.
1
Talvez. No 2.7.6, não há exceção se o valor do formato não for tupla (pelo menos neste exemplo). Olhando para a data do meu comentário, acho que eu estava executando o 2.7.3 naquela época e, naquela época, não sabia que colocar uma variável única em uma tupla coloca você em um lado seguro ao usar o %formatador de strings.
Theta
1
Para elaborar, os documentos explicam isso aqui: "Quando nenhum alinhamento explícito é fornecido, precedendo o campo de largura por um caractere zero ('0') ativa o preenchimento de zero com reconhecimento de sinal para tipos numéricos. Isso é equivalente a um caractere de preenchimento de ' 0 'com um tipo de alinhamento de' = '. "
JHS
940

Você pode usar str.zfill:

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

impressões:

01
10
100
Datageek
fonte
71
Eu gosto dessa solução, pois ajuda não apenas na saída do número, mas quando você precisa atribuí-lo a uma variável ... por exemplo, x = str (datetime.date.today (). Month) .zfill (2) retornará x como '02' para o mês de fevereiro.
EroSan
2
Essa deve ser a resposta correta, pois ela "{1:02d}"não pode ter variáveis ​​no lugar de 2(como se você estivesse criando uma função dinâmica).
Joshua Varghese
363

No Python 2.6+ e 3.0+, você usaria o format()método string:

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

ou usando o built-in (para um único número):

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

Consulte a documentação do PEP-3101 para obter as novas funções de formatação.

Ber
fonte
29
Também funciona em Python 2.7.5. Você também pode usar '{: 02d}'. Format (1) se não quiser usar argumentos nomeados.
Jason Martens
1
Funciona bem no 2.7.2, com um ponto flutuante "{0: 04.0f}". O formato (1.1) fornece 0001 (: 04 = pelo menos 4 caracteres, neste caso, os 0s iniciais .0f = ponto flutuante sem decimais) . Estou ciente de formatar o% mas queria modificar uma declaração .format existente sem reescrever o todo coisa. Obrigado!
Michael Stimson
129
print('{:02}'.format(1))
print('{:02}'.format(10))
print('{:02}'.format(100))

impressões:

01
10
100
Kresimir
fonte
1
Dessa forma, você pode repetir o argumento várias vezes na string:One zero:{0:02}, two zeros: {0:03}, ninezeros: {0:010}'.format(6)
srodriguex 14/04
2
Compatível apenas com o Python 3. Se você estiver usando o Python 2.7, façaprint '{:02}'.format(1)
Blairg23
89

Ou isto:

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

ajd
fonte
73

No Python> = 3.6 , você pode fazer isso de forma sucinta com as novas strings f que foram introduzidas usando:

f'{val:02}'

que imprime a variável com o nome valcom um fillvalor de 0e um widthde 2.

Para o seu exemplo específico, você pode fazer isso muito bem em um loop:

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

que imprime:

01 
10
100

Para obter mais informações sobre strings-f, dê uma olhada no PEP 498 onde foram introduzidas.

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

resulta em:

01
10
100

Leia mais informações sobre a formatação de cadeias usando% na documentação.

nosklo
fonte
9
O exemplo de documentação é péssimo. Eles lançam o mapeamento com a amostra zero líder, por isso é difícil saber qual é qual, a menos que você já saiba como funciona. Foi isso que me trouxe aqui, na verdade.
Grant
49

A maneira pitônica de fazer isso:

str(number).rjust(string_width, fill_char)

Dessa forma, a string original será retornada inalterada se seu comprimento for maior que string_width. Exemplo:

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

Resultados:

01
10
100
Zulu
fonte
33

Ou outra solução.

"{:0>2}".format(number)
Inverno
fonte
3
Esta seria a maneira Python, embora eu gostaria de incluir o parâmetro para maior clareza - "{0:0>2}".format(number), se alguém quer nLeadingZeros eles devem notar que eles também podem fazer:"{0:0>{1}}".format(number, nLeadingZeros + 1)
Jonathan Allan
4

É assim que eu faço:

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

Basicamente, o zfill pega o número de zeros à esquerda que você deseja adicionar, por isso é fácil pegar o número maior, transformá-lo em uma string e obter o comprimento, assim:

Python 3.6.5 (padrão, 11 de maio de 2018, 04:00:52) 
[GCC 8.1.0] no Linux
Digite "ajuda", "direitos autorais", "créditos" ou "licença" para obter mais informações.
>>> 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
fonte
Isso não contradiz a resposta de Datageek ?
Peter Mortensen
1
width = 5
num = 3
formatted = (width - len(str(num))) * "0" + str(num)
print formatted
nvd
fonte
1

Você pode fazer isso com f strings .

import numpy as np

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

Isso imprimirá um comprimento constante de 8 e preencherá o resto com a liderança 0.

00000001
00000124
00013566
Nicolas Gervais
fonte
0

Usar:

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

Ou com o mathmódulo:

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

Se estiver lidando com números com um ou dois dígitos:

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

Knowbody
fonte