O que é uma maneira Pythonic de preencher uma string numérica com zeros à esquerda, ou seja, para que a string numérica tenha um comprimento específico?
python
string
zero-padding
Nicolas Gervais
fonte
fonte
python >= 2.6
estão incorretos. Essa sintaxe não funcionapython >= 3
. Você pode alterá-lo parapython < 3
, mas posso sugerir sempre usar parênteses e omitir completamente os comentários (incentivando o uso recomendado)?'{:03d} {:03d}'.format(1, 2)
atribui implicitamente os valores em ordem.print
declaração, quando deveria ser umaprint
função no Python 3? Editei nas parênteses; Como apenas uma coisa está sendo impressa, ela funciona de forma idêntica agora no Py2 e Py3.Basta usar o método rjust do objeto string.
Este exemplo criará uma sequência de 10 caracteres, preenchendo conforme necessário.
fonte
Além disso
zfill
, você pode usar a formatação geral de strings:Documentação para formatação de strings e f-strings .
fonte
format
, e as pessoas geralmente interpretam isso como intenção de desaprovação.Para Python 3.6+ usando f-strings:
Para Python 2 e Python 3.5:
fonte
se você quiser o contrário:
fonte
str(n).zfill(width)
funcionará comstring
s,int
s,float
s ... e é compatível com Python 2. x e 3. x :fonte
Para aqueles que vieram aqui para entender e não apenas uma resposta rápida. Eu faço isso especialmente para seqüências de tempo:
fonte
str.zfill
destina-se especificamente a fazer isso:Observe que ele se destina especificamente a manipular cadeias numéricas conforme solicitado e move a
+
ou-
para o início da cadeia:Aqui está a ajuda sobre
str.zfill
:atuação
Este também é o método mais eficiente de métodos alternativos:
Para comparar melhor maçãs com maçãs pelo
%
método (observe que na verdade é mais lento), que de outra forma pré-calculará:Implementação
Com um pouco de pesquisa, encontrei a implementação do
zfill
método emObjects/stringlib/transmogrify.h
:Vamos percorrer esse código C.
Primeiro, ele analisa o argumento em posição, o que significa que não permite argumentos de palavras-chave:
Em seguida, verifica se tem o mesmo comprimento ou mais e, nesse caso, retorna a string.
zfill
chamadaspad
(estapad
função também é chamada porljust
,rjust
ecenter
também). Basicamente, isso copia o conteúdo para uma nova string e preenche o preenchimento.Após a chamada
pad
,zfill
move todos os anteriores+
ou anteriores-
ao início da sequência.Observe que, para que a string original seja realmente numérica, não é necessário:
fonte
+
e-
, e eu adicionei um link para a documentação!Consulte a documentação impressa para obter todos os detalhes interessantes!
Atualização para o Python 3.x (7,5 anos depois)
Essa última linha agora deve ser:
Ou
print()
seja, agora é uma função, não uma declaração. Note que eu ainda prefiro oprintf()
estilo Old School porque, IMNSHO, parece melhor, e porque, eu uso essa notação desde janeiro de 1980. Algo ... cachorros velhos .. algo algo ... novos truques.fonte
"%0*d" % (width, x)
é interpretado por python?Ao usar Python
>= 3.6
, a maneira mais limpa é usar f-strings com formatação de string :Eu preferiria formatar com um
int
, pois só então o sinal será tratado corretamente:fonte
Para CEPs salvos como números inteiros:
fonte
Comparação rápida de tempo:
Eu fiz testes diferentes de diferentes repetições. As diferenças não são enormes, mas em todos os testes, a
zfill
solução foi mais rápida.fonte
Outra abordagem seria usar uma compreensão de lista com uma verificação de condição para comprimentos. Abaixo está uma demonstração:
fonte
Está tudo bem também:
então a saída será: "02:07:03"
fonte
Você também pode repetir "0", anexá-lo
str(n)
e obter a fatia de largura mais à direita. Expressão rápida e suja.fonte