Python Formatação

Esta é a página de consulta da mini-linguagem de formatação do Python: os códigos que vão depois dos dois-pontos dentro das chaves de uma f-string, como o >10.2f de f"{preco:>10.2f}". Com eles você alinha colunas, fixa as casas decimais, põe separador de milhar, mostra porcentagens, números em binário e datas no formato brasileiro. A explicação passo a passo das f-strings está na aula f-strings: Formatando Textos; aqui ficam as tabelas para consultar.

Como ler as tabelas
  • Exemplo é uma f-string que você pode digitar no modo interativo (>>>).
  • Resultado é o que o Python 3.14.4 respondeu no computador da Ana, mostrado entre aspas, como o modo interativo mostra, para você enxergar os espaços. Com print(), as aspas não aparecem.
  • Os exemplos usam estas variáveis: preco = 1234.5, nome = "Ana", n = 42, x = -7.25 e largura = 8.
  • O | no fim de alguns exemplos é só uma "parede", para mostrar onde o espaço reservado termina.

Pule direto para o que você procura:


A anatomia de uma especificação

Dentro das chaves vem o valor, dois-pontos e a especificação (em inglês, format spec). Cada parte é opcional, mas a ordem é fixa:

>>> preco = 1234.5
>>> f"{preco:>10.2f}"
'   1234.50'
preco
O valor a formatar (uma variável, uma conta, uma chamada de função).
:
Separa o valor da especificação.
>
Alinhamento: à direita.
10
Largura: o resultado ocupa pelo menos 10 posições.
.2
Precisão: 2 casas decimais.
f
Tipo: número com casas decimais fixas (fixed point).

A ordem completa, como na documentação oficial:

PosiçãoParteValoresExemplo
1preenchimentoqualquer caractere (só junto com um alinhamento)* em *^9
2alinhamento< > ^ =>
3sinal+ - espaço+
4ztransforma -0.0 em 0.0z.1f
5#prefixo 0b, 0o, 0x#x
60completa com zeros05
7larguraum número10
8agrupamento, ou _,
9precisão. e um número.2
10tipos d f e g % b o x X c n…f

Um exemplo com quase tudo: f"{1234.5:12,.2f}|" (largura 12, separador de milhar, 2 casas) dá '    1,234.50|'.

O mesmo código funciona fora das f-strings, na função format() e no método .format(): format(1234.5, ",.2f") dá '1,234.50'.


Largura e alinhamento

A largura é o número mínimo de posições. Se o valor for menor, o resto vira espaço; se for maior, nada é cortado. Sem alinhamento, textos ficam à esquerda e números à direita.

CódigoO que fazExemploResultado
NLargura N, alinhamento padrão (texto à esquerda)f"{nome:8}|"'Ana     |'
NLargura N, alinhamento padrão (número à direita)f"{n:8}|"'      42|'
<NÀ esquerdaf"{nome:<8}|"'Ana     |'
>NÀ direitaf"{nome:>8}|"'     Ana|'
^NCentralizado (sobrando um espaço, ele vai para a direita)f"{nome:^8}|"'  Ana   |'
=NSó para números: o sinal fica na ponta esquerda e os espaços vêm depois delef"{x:=10}|"'-     7.25|'

É assim que se monta uma tabela alinhada na tela:

produtos = [("Pão francês", 0.75, 12), ("Leite", 5.5, 2), ("Queijo minas", 42.9, 1)]

print(f"{'Produto':<14}{'Preço':>9}{'Qtd':>5}{'Total':>10}")
print("-" * 38)
soma = 0
for nome, preco, qtd in produtos:
    total = preco * qtd
    soma = soma + total
    print(f"{nome:<14}{preco:>9.2f}{qtd:>5}{total:>10.2f}")
print("-" * 38)
print(f"{'TOTAL':<28}{soma:>10.2f}")
$ python3 tabela.py
Produto           Preço  Qtd     Total
--------------------------------------
Pão francês        0.75   12      9.00
Leite              5.50    2     11.00
Queijo minas      42.90    1     42.90
--------------------------------------
TOTAL                            62.90

Experimente: troque as larguras (14, 9, 5, 10) e os alinhamentos (<, >, ^) e veja a tabela mudar. Tente acrescentar um produto com nome comprido: o que acontece quando ele passa de 14 letras?

produtos = [("Pão francês", 0.75, 12), ("Leite", 5.5, 2), ("Queijo minas", 42.9, 1)]

print(f"{'Produto':<14}{'Preço':>9}{'Qtd':>5}{'Total':>10}")
print("-" * 38)
soma = 0
for nome, preco, qtd in produtos:
    total = preco * qtd
    soma = soma + total
    print(f"{nome:<14}{preco:>9.2f}{qtd:>5}{total:>10.2f}")
print("-" * 38)
print(f"{'TOTAL':<28}{soma:>10.2f}")

Preenchimento e zeros

Em vez de espaço, o espaço vazio pode ser preenchido com qualquer caractere. Ele vem logo antes do alinhamento, que fica obrigatório.

CódigoO que fazExemploResultado
*^9Centraliza em 9 posições, preenchendo com *f"{nome:*^9}"'***Ana***'
.<10Pontinhos depois do texto (como num índice de livro)f"{nome:.<10}"'Ana.......'
0NNúmero com zeros à esquerda, até N posiçõesf"{n:05}"'00042'
0>NO mesmo, escrito com preenchimentof"{n:0>5}"'00042'
02Horas e minutos com dois algarismosf"{7:02}:{5:02}"'07:05'
0N com sinalOs zeros entram depois do sinalf"{x:010}"'-000007.25'
+0N.2fSinal, zeros e casas decimais juntosf"{12.5:+08.2f}"'+0012.50'
08bBinário com 8 algarismosf"{5:08b}"'00000101'

Sinal

CódigoO que fazExemploResultado
-Sinal só nos negativos (é o padrão)f"{n:-}"'42'
+Sinal sempre, + ou -f"{n:+}", f"{x:+}"'+42', '-7.25'
espaçoUm espaço no lugar do + (os positivos ficam alinhados com os negativos)f"{n: }", f"{x: }"' 42', '-7.25'
zUm número que, arredondado, vira -0.0 aparece como 0.0f"{-0.0001:.1f}", f"{-0.0001:z.1f}"'-0.0', '0.0'
Versões

A opção z existe desde o Python 3.11, e o _ desde o 3.6. Tudo o que está nesta página funciona no 3.13 do Debian, menos o agrupamento das casas decimais (seção Separador de milhar), que é do 3.14.


Casas decimais (precisão)

A precisão é um ponto seguido de um número. O que ela faz depende do tipo:

CódigoO que fazExemploResultado
.2fExatamente 2 casas decimais (arredonda)f"{3.14159:.2f}"'3.14'
.2f num inteiroAcrescenta as casasf"{7:.2f}"'7.00'
.0fSem casas decimaisf"{3.14159:.0f}"'3'
.0f no meioComo o round(): no meio exato, vai para o parf"{2.5:.0f}"'2'
.3 (sem tipo)3 algarismos no total, não 3 casasf"{3.14159:.3}"'3.14'
Se não couber, passa para notação científicaf"{1234.5:.3}"'1.23e+03'
.N num textoCorta o texto em N letrasf"{'Conceição':.5}"'Conce'
.{v}A precisão vinda de uma variávelf"{3.14159:.{2}f}"'3.14'

Por que 2.5 vira 2, e não 3? É o "arredondamento do banqueiro", explicado na aula Funções Embutidas (seção do round()).


Separador de milhar

O , e o _ agrupam os algarismos de 3 em 3. O separador sai sempre no padrão americano (vírgula no milhar, ponto nos decimais); para o padrão brasileiro, veja O jeito brasileiro.

CódigoO que fazExemploResultado
,Vírgula a cada 3 algarismosf"{1234567:,}"'1,234,567'
_Sublinhado a cada 3 algarismosf"{1234567:_}"'1_234_567'
,.2fMilhar e 2 casasf"{1234567.891:,.2f}"'1,234,567.89'
_.2fO mesmo com sublinhadof"{1234567.891:_.2f}"'1_234_567.89'
+,.2fCom o sinalf"{-1234.5:+,.2f}"'-1,234.50'
_b, _xEm binário e hexadecimal, o _ agrupa de 4 em 4f"{255:_b}", f"{1234567:_x}"'1111_1111', '12_d687'
., 3.14Agrupa as casas decimaisf"{123456789.123456789:.,}"'123456789.123,456,79'
,._ 3.14Vírgula na parte inteira, sublinhado nas casasf"{123456789.123456789:,._}"'123,456,789.123_456_79'
.6_f 3.146 casas, agrupadasf"{3.14159265:.6_f}"'3.141_593'

Os tipos

A letra do fim diz como o valor vai ser escrito.

TipoNomeExemploResultado
sTexto (o padrão para textos)f"{nome:s}"'Ana'
dInteiro em decimal (o padrão para int)f"{n:d}"'42'
fCasas decimais fixas (6, se não disser a precisão)f"{preco:f}"'1234.500000'
%Porcentagem: multiplica por 100 e põe o %f"{0.256:.1%}"'25.6%'
f"{0.256:.0%}", f"{1:.0%}"'26%', '100%'
sem precisão, 6 casasf"{0.256:%}"'25.600000%'
e / ENotação científica (e+08 = "vezes 10 elevado a 8")f"{299792458:.2e}"'3.00e+08'
f"{299792458:e}", f"{0.000123:.2E}"'2.997925e+08', '1.23E-04'
g"Geral": decimal ou científica, o que ficar mais curtof"{1234.5:g}", f"{299792458:g}"'1234.5', '2.99792e+08'
f"{0.0000123:g}"'1.23e-05'
bBinário (base 2)f"{255:b}"'11111111'
oOctal (base 8)f"{255:o}"'377'
x / XHexadecimal (base 16), letras minúsculas / maiúsculasf"{255:x}", f"{255:X}"'ff', 'FF'
#b, #o, #xCom o prefixo da basef"{255:#b}", f"{255:#o}", f"{255:#x}"'0b11111111', '0o377', '0xff'
cO caractere daquele número (como o chr())f"{65:c}"'A'
nComo d ou g, mas com o separador do idioma configurado (veja O jeito brasileiro)f"{1234567:n}"depende do locale

Largura variável, !r e o = de depuração

EscritaO que fazExemploResultado
{v:>{largura}}Chaves dentro da especificação: a largura vem de uma variávelf"{nome:>{largura}}|"'     Ana|'
!rMostra o valor como no código (com aspas, usando repr())f"{nome!r}""'Ana'"
!sUsa str() (o padrão)f"{nome!s}"'Ana'
{v=}Mostra o nome, o = e o valor: ótimo para depurarf"{preco=}"'preco=1234.5'
{v = :.2f}Os espaços em volta do = aparecem na saída; a especificação vem depoisf"{preco = :.2f}"'preco = 1234.50'
{{ e }}Uma chave de verdade no textof"{{n}} vale {n}"'{n} vale 42'

Datas e horas (strftime)

Com datas do módulo datetime (aula Datas e Horas), a especificação é outra: os códigos de %, os mesmos do método .strftime() (string format time, "formatar o tempo como texto"). Os exemplos usam data = datetime(2026, 10, 18, 14, 30, 5), um domingo, às 14h30min05s.

CódigoO que éExemploResultado
%d/%m/%YDia, mês e ano com 4 algarismos: o formato brasileirof"{data:%d/%m/%Y}"'18/10/2026'
%yAno com 2 algarismosf"{data:%d/%m/%y %H:%M}"'18/10/26 14:30'
%Y-%m-%dO formato internacional (ISO 8601), bom para nomes de arquivof"{data:%Y-%m-%d}"'2026-10-18'
%H:%M:%SHora (0 a 23), minuto e segundof"{data:%H:%M:%S}"'14:30:05'
%I e %pHora de 1 a 12 e AM/PMf"{data:%I:%M %p}"'02:30 PM'
%A / %aDia da semana, completo / abreviadof"{data:%A}" / f"{data:%a}"'Sunday' / 'Sun' (veja abaixo)
%B / %bNome do mês, completo / abreviadof"{data:%B}" / f"{data:%b}"'October' / 'Oct'
%jDia do ano (1 a 366)f"{data:%j}"'291'
%USemana do ano (começando no domingo)f"{data:%U}"'42'
%%Um % de verdadef"{data:%%}"'%'
%-d, %-mSem o zero da frente. Funciona no Linux da Ana e no editor do guia, mas depende do sistema: não conte com ele em todo computadorf"{date(2026, 3, 5):%-d/%-m}"'5/3'
.strftime()O mesmo, como métododata.strftime("%d/%m/%Y")'18/10/2026'
Os nomes saem em inglês

Mesmo no computador da Ana, que está em português, %A e %B dão Sunday e October: o Python começa sempre no idioma "neutro" (em inglês). Para usar o idioma do sistema, chame locale.setlocale(locale.LC_ALL, "") no começo do programa:

import locale
from datetime import datetime

locale.setlocale(locale.LC_ALL, "")
data = datetime(2026, 10, 18, 14, 30, 5)
print(f"{data:%A, %d de %B de %Y}")
print(f"{data:%x %X}")
$ python3 data_pt.py
domingo, 18 de outubro de 2026
18/10/2026 14:30:05

(%x e %X são a data e a hora no formato do idioma.) No editor do guia, que roda o Python no navegador, o setlocale não dá erro, mas os nomes continuam em inglês. Se você precisa dos nomes em português em qualquer lugar, use uma lista sua: ["segunda", "terça", …][data.weekday()].


O jeito brasileiro: 1.234,50

No Brasil, o milhar é separado por ponto e os decimais por vírgula, o contrário do que o ,.2f faz. Há dois caminhos.

1. Trocar os caracteres

Formate no padrão americano e depois troque vírgula por ponto e ponto por vírgula. O método .translate() faz a troca dupla de uma vez (com .replace(), é preciso um caractere intermediário, senão a segunda troca desfaz a primeira):

def brl(valor):
    texto = f"{valor:,.2f}"
    return "R$ " + texto.translate(str.maketrans(",.", ".,"))


print(brl(1234567.891))
print(brl(0.5))
print(brl(-42))
$ python3 brl.py
R$ 1.234.567,89
R$ 0,50
R$ -42,00
Escrita (com valor = 1234567.891)Resultado
f"{valor:,.2f}"'1,234,567.89'
f"{valor:,.2f}".translate(str.maketrans(",.", ".,"))'1.234.567,89'
f"{valor:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".")'1.234.567,89'
f"{valor:_.2f}".replace(".", ",").replace("_", ".")'1.234.567,89'

2. Usar o idioma do sistema (locale)

Com o locale configurado para português do Brasil (como no computador da Ana), o módulo locale formata do jeito brasileiro, até com o R$:

import locale

locale.setlocale(locale.LC_ALL, "")
valor = 1234567.891
print(locale.currency(valor, grouping=True))
print(locale.format_string("%.2f", valor, grouping=True))
print(f"{1234567:n}")
$ python3 br.py
R$ 1.234.567,89
1.234.567,89
1.234.567
Qual usar?

O locale depende da configuração do computador: no computador de outra pessoa (ou num servidor em inglês), o mesmo programa mostra outra coisa. No editor do guia, por exemplo, o locale.currency termina em ValueError: Currency formatting is not possible using the 'C' locale. A troca de caracteres dá sempre o mesmo resultado. Para um programa que sempre vai mostrar reais, a troca é a escolha mais segura.

Missão: a função mostra os preços no formato americano. Mude a função brl para mostrar R$ 1.234,50 e R$ 0,99: duas casas, ponto no milhar e vírgula nos decimais.

def brl(valor):
    return f"R$ {valor}"


print(brl(1234.5))
print(brl(0.99))
def brl(valor):
    texto = f"{valor:,.2f}"
    return "R$ " + texto.translate(str.maketrans(",.", ".,"))


print(brl(1234.5))
print(brl(0.99))

Os jeitos antigos: .format() e %

Antes das f-strings (Python 3.6), formatava-se de outros dois jeitos, que você ainda encontra em muito código. O .format() usa a mesma mini-linguagem desta página; o % usa códigos parecidos, mas mais limitados.

JeitoExemploResultado
f-string (prefira)f"{3.5:>8.2f}"'    3.50'
.format()"{:>8.2f}".format(3.5)'    3.50'
"{} tem {} anos".format("Ana", 30)'Ana tem 30 anos'
format()format(1234.5, ",.2f")'1,234.50'
% (o mais antigo)"%.2f" % 3.14159'3.14'
"%5d|" % 42'   42|'
"%s tem %d anos" % ("Ana", 30)'Ana tem 30 anos'

Erros comuns

A especificação precisa combinar com o tipo do valor. Quando não combina, vem um ValueError (erro de valor). No modo interativo:

$ python3 -q
>>> f"{'Ana':.2f}"
Traceback (most recent call last):
  File "<python-input-0>", line 1, in <module>
    f"{'Ana':.2f}"
      ^^^^^^^^^^^
ValueError: Unknown format code 'f' for object of type 'str'
>>> f"{3.5:d}"
Traceback (most recent call last):
  File "<python-input-1>", line 1, in <module>
    f"{3.5:d}"
      ^^^^^^^
ValueError: Unknown format code 'd' for object of type 'float'
>>> exit()
ExemploMensagemO que houve
f"{'Ana':.2f}"ValueError: Unknown format code 'f' for object of type 'str'"Código f desconhecido para um str." O valor é um texto (muitas vezes, o que veio do input()): converta com float() antes
f"{3.5:d}"ValueError: Unknown format code 'd' for object of type 'float'd é só para inteiros. Use .0f, ou int() antes
f"{42:.2s}"ValueError: Unknown format code 's' for object of type 'int's é só para textos
f"{'Ana':+}"ValueError: Sign not allowed in string format specifier"Sinal não permitido para textos"
f"{1234:,_}"ValueError: Cannot specify both ',' and '_'."Não dá para usar , e _ juntos" (na mesma parte do número)
f"{'Ana':05}"sem erro: 'Ana00'O 0 num texto completa com zeros à direita. Provavelmente não era o que você queria
f"{'18/10/2026':%d/%m/%Y}"ValueError: Invalid format specifier '%d/%m/%Y' for object of type 'str'Os códigos de % só funcionam com objetos date/datetime; converta o texto com datetime.strptime()

Resumo

  • A ordem da especificação é fixa: preenchimento, alinhamento, sinal, z, #, 0, largura, agrupamento, precisão, tipo. Ex.: *>+12,.2f.
  • Alinhamento: < esquerda, > direita, ^ centro. Textos ficam à esquerda e números à direita por padrão.
  • .2f = 2 casas; , ou _ = separador de milhar; .1% = porcentagem; b/o/x = outras bases.
  • Datas usam os códigos %: f"{data:%d/%m/%Y}". Nomes de dia e mês saem em inglês sem locale.setlocale().
  • Para o formato brasileiro, formate com ,.2f e troque os caracteres com .translate(str.maketrans(",.", ".,")).