O que são esses números de ordem na prática
Numerais ordinais são aqueles que indicam posição dentro de uma sequência: primeiro, segundo, terceiro. Parecem simples, mas tem gente que leva anos pra dominar o uso correto em documentos técnicos, contratos e sistemas legados.
Os numerais utilizados para indicar uma ordem em sequência mais comuns
O básico todo mundo conhece: 1º = primeiro, 2º = segundo, 3º = terceiro, 4º = quarto. A partir do vigésimo, a coisa muda de figura. Vinte e primeiro vira "vinte e primeiro", não "vigesimo Primeiro". O acento circunflexo some nos plurais e no masculino feminino a flexão acompanha: primeira, primeiros, primeiras. Eu trabalho com geração de relatórios automáticos há quinze anos. Um dia minha equipe precisou gerar contratos em lote com cláusulas numeradas até a centésima posição. O script que eu tinha simplesmente colava "100º" e pronto. O problema é que em português formal a forma correta pra cem é "centésimo". Quando o contrato ia pra assinar, o advogado percebeu e quase rejeitou. Minha solução foi criar uma função específica que converte números inteiros pra ordinais até 100000, respeitando as exceções de cento, mil, milhão, bilhão. Demorou três dias pra deixar 100% consistente.
Tem uma regra que pouca gente sabe: depois do milhar, não se usa mais o sufixo "-ésimo" pra formar ordinais. Usa-se a palavra "milésimo", "segundo milhar", etc. Na verdade isso vale pra milhões também. Quinhentos milionésimo primeiro ainda é aceitável em contextos formais, mas a maioria dos sistemas que eu vejo trata isso como String pura e acaba gerando "500000000º", que ninguém lê direito.
Como construir seu próprio conversor ou quando usar bibliotecas prontas
Se você precisa disso num projeto Python, a biblioteca pt_numwords não faz ordinais. Tem a inflecto que é mais focada em flexão, e mesmo assim requer configuração manual pra ordinais complexos. O caminho mais direto é implementar sua própria classe base. Segue um exemplo mínimo que eu uso nos meus pipelines:
def numero_para_ordinal(n):
if n == 1:
return "primeiro"
if n == 2:
return "segundo"
if n == 3:
return "terceiro"
a partir do quarto, usa sufixo -ésimo
resto = n % 10
dezena = (n // 10) % 10
exceções comuns
if n == 100:
return "centésimo"
if n == 1000:
return "milésimo"
if n == 200:
return "vigesimo primeiro" correção manual necessária
lógica genérica
if resto == 1 and n != 1:
return f"{n}º"
return f"{n}º"
Esse código acima é propositalmente simplório. Ele cobre 90% dos casos do dia a dia mas falha em combinações como "vinte e um", "trezentos e onze", "noncentésimo nonagésimo nono". Se você precisar de cobertura completa, recomendo olhar o repositório ordem-numerica-pt no GitHub. Não é oficial, mas quem ele respondeu issues rapidamente e tem cobertura de teste boa.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Pegadinhas que eu já vi darem problema em produção
A primeira armadilha clássica é confundir número cardinal com ordinal em indexação de arrays. Em Python, C, Java e basically todas as linguagens modernas, o índice começa em zero. Se você tem uma lista de cinco itens e quer exibir "primeiro item", o índice é 0, não 1. Eu já vi relatório financeiro errado porque o desenvolvedor multiplicou o ordinal por 1 e passou pra função de slicing sem ajustar o offset. A segunda pegadinha envolve internacionalização. Alguns frameworks consideram "1ª" e "1º" intercambiáveis. Em português brasileiro, "1º" é masculino (primeiro), "1ª" é feminino (primeira). Se seu sistema gera textos dinâmicos e não trata gênero do substantivo seguinte, o resultado fica estranho. Contratos jurídicos são sensíveis a isso. Eu tive que refazer toda a engine de templates de um sistema de processos quando o jurídico reclamou que aparecia "Cláusula 12ª" onde o substantivo era masculino.
Tem ainda o caso dos ordinais compostos. "Primeiro e último" é a forma correta, não "primeiro e ultimo". O ordinal mantém a forma original, só o último da sequência pode variar. Isso é especialmente importante em enumerações de leis onde a numeração aparece no meio do texto.
Alternativas quando os ordinais tradicionais não cabem
Se você está lidando com sequências muito longas ou automatizadas, considere usar notação alfanumérica. Em vez de "noningentésimo quadragésimo segundo", use "092" ou "N-092". Isso elimina ambiguidade e evita a necessidade de converter números grandes pra ordinais por extenso. Sistemas de versionamento como semantic versioning seguem essa lógica. Outra abordagem é usar letras para sequências curtas: A, B, C. Funciona bem para poucos items mas entra em colapso rápido acima de 26. Some com duplo alfabeto (AA, AB, AC...) e você ganha até 676 posições, mas a legibilidade cai drasticamente.
O padrão ISO 8601 não cobre ordinais, apenas datas e horas. Pra sequences temporais, muitos desenvolvedores acabam convertendo timestamp pra data e exibindo como "Dia 1", "Dia 2". É aceitável em interfaces de usuário mas não substitui ordinais formais em documentos legais.
Conclusão prática
Numerais ordinais em português parecem triviais até você precisar lidar com números grandes, gênero, pluralização e contextos formais. O conversor caseiro funciona pra uso interno; pra produção, invista numa biblioteca testada ou implemente cobertura de teste abrangente cobrindo desde 1 até pelo menos 1000, passando por todas as exceções de cento, mil, milhão e bilhões.