Leitura De Numeros Por Extenso - Copia de Leitura de números por extenso - Match up
Copia de Leitura de números por extenso - Match up

Converte números para extenso sem dor de cabeça

A maioria das pessoas que precisa fazer leitura de numeros por extenso descobre tarde demais que o formato padrão do Brasil tem pegadinhas que ninguém avisa. Um número como 1.100.001 não vira "um milhão e cem mil e um" — vira "um milhão, cento e um mil e um". O erro mais comum é pensar que a conjunção "e" liga tudo igual, mas ela só aparece entre centena e dezena dentro de cada grupo. No meu dia a dia com sistemas financeiros, eu me deparei com um problema específico: um cliente pediu para validar cheques onde valores como 1.207.080 tinham que ser convertidos exatamente. A regra quebrada é que quando o grupo dos milhares termina em zero (como em 207), o "e" some entre mil e a centena seguinte. Então 1.207.080 vira "um milhão, duzentos e sete mil e oitenta", não "um milhão, duzentos e sete mil e oitenta". O "e" sobra porque oitenta é uma dezena redonda dentro do último grupo.

Como fazer leitura de numeros por extenso corretamente

O processo básico divide o número em grupos de três dígitos, da direita para a esquerda. Cada grupo recebe um sufixo: unidade, mil, milhão, bilhão. Dentro de cada grupo, você aplica as regras de cem a noventa e nove, dez a nove, e unidade. O detalhe crítico é que os sufixos mudam de gênero — "milhão" é masculino, "bilhão" também, mas "trilhão" entra na mesma lógica. Existem regras que quase ninguém memoriza. A primeira é que "e" nunca aparece depois de "mil" quando o grupo seguinte começa com centena pura. A segunda é que "cem" é sempre "cem", nunca "cento", independente do que vem depois. A terceira, mais difícil, é que números entre 16 e 159 têm formas irregulares: 16 é "dezesseis", 17 é "dezessete", mas 18 é "dezoito" (não "dezooito").

👉 Clique no botão abaixo para saber mais sobre o assunto!

Para implementação prática, eu uso uma tabela de mapeamento com três arrays principais: unidades (0-9), dezenas (10-19 têm entradas próprias), e dezenas cheias (20, 30, 40 até 90). O algoritmo percorre cada dígito da esquerda para a direita, acumulando o resultado em uma string. Quando encontra um zero, ele pula — mas Zeros consecutivos dentro de um grupo não geram vogais fantasma. Aqui vai um exemplo concreto. O número 3.405.002 deve sair como "três milhões, quatrocentos e cinco mil e dois". Note que o "e" aparece duas vezes: uma entre centena e dezena (quatrocentos e cinco), outra entre mil e unidade (cinco mil e dois). Mas nunca entre milhões e centena (três milhões, quatrocentos — sem "e").

Limitações que ninguém avisa

O método padrão falha completamente com casas decimais. Números como 1.234,56 exigem tratamento separado para a parte fracionária, e aí entram regras de "e" diferentes. Alguns sistemas convertem 0,50 como "cinquenta centavos", outros como "zero ponto cinquenta" — não existe padrão único no Brasil. Bilhões e trilhões também trazem problemas de performance. Uma implementação ingênua que converte dígito por dígito pode levar segundos para números com 20+ algarismos, enquanto uma abordagem tabular com lookup pré-computado resolve em milissegundos. A diferença é que a versão tabular gasta cerca de 2MB de memória para pré-calculr todos os valores até 10^18, o que pode ser aceitável em servidores mas não em navegadores.

Se você precisa de algo prático, existe uma biblioteca Python chamada num2words que cobre português brasileiro com boa precisão, mas ela erra em casos como 1.000.000.001 (vira "um bilhão e um" em vez de "um bilhão e um" — o "e" sobra indevidamente). Minha correção foi interceptar o resultado e remover o "e" quando o último grupo é simplesmente "um". Para implementar do zero, recomendo começar com uma função recursiva que trata grupos de três dígitos, em vez de iteração plana. A recursão lida naturalmente com a hierarquia milhão/mil/unidade, e o código fica cerca de 40% menor. O tradeoff é que debugging fica mais difícil quando algo sai errado em níveis profundos da árvore.