Como escrever valores monetários em inglês por extenso — guia prático
Você provavelmente já precisou colocar um valor em dólares ou euros por extenso em um contrato, uma fatura ou um documento legal. A maioria das pessoas vai até uma conversora automática na internet, cola o número e torce para dar certo. Eu fiz isso por anos até um cliente devolver o arquivo porque a conversão de centavos estava errada em trechos específicos. O problema não é a ferramenta em si, mas sim entender como o sistema funciona por baixo e onde ele costuma falhar.
O que é data em ingles por extenso
Data em ingles por extenso é basicamente a representação textual de valores numéricos, geralmente monetários, escritos conforme as regras do inglês americano ou britânico. Diferente do português, onde dizemos "mil reais e cinquenta centavos", no inglês americano o padrão mais comum é "one thousand dollars and fifty cents". A versão britânica usa "one thousand pounds and fifty pence" e traz nuances de pontuação e concordância que precisam ser respeitadas em documentos oficiais.
Método de conversão passo a passo
A lógica por trás da conversão é mais simples do que parece. Você divide o número em grupos de três algarismos, da direita para a esquerda, e converte cada grupo isoladamente. Cada posição tem um sufixo: ones (sem sufixo), thousands, millions, billions, trillions. O valor decimal é tratado separadamente, convertendo os dois dígitos após o ponto como cents ou pence. Por exemplo, vamos converter 1.234.567,89 USD. Separamos: 1 | 234 | 567 | 89. O primeiro grupo é "one billion", o segundo "two hundred thirty-four million", o terceiro "five hundred sixty-seven thousand" e o decimal "eighty-nine cents". O resultado final é: "one billion two hundred thirty-four million five hundred sixty-seven thousand eight hundred eighty-nine dollars and eighty-nine cents". Note que nos EUA não se usa "and" entre as casas decimais e os dólares, ao contrário do que muitos scripts automáticos fazem por padrão.
Por que as ferramentas online falham frequentemente
Eu descobri isso na prática quando processei uma nota fiscal em libras esterlinas com valor de £450.000,50. A conversora que eu usava retornou "four hundred fifty thousand pounds and fifty pence" — parecia certo, mas omitiu o "and" após "pounds", que é obrigatório em documentos formais britânicos. A versão correta seria "four hundred fifty thousand pounds and fifty pence" na verdade essa forma está aceitável, mas em contextos legais britânicos a forma completa exige "four hundred and fifty thousand pounds and fifty pence". O "and" após a casa das centenas é mandatório no inglês britânico formal. Outro problema recorrente: valores com zero no meio. O número 1.000.002 em dólar deveria ser "one million two", mas várias APIs devolvem "one million zero two" ou simplesmente quebram. Isso acontece porque o código não trata grupos inteiros preenchidos com zeros como invisíveis para a conversão.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Workaround que funcionou para mim
Depois de ter que revisar manualmente dezenas de valores, eu parametrizei uma função própria em Python usando a biblioteca num2words. Ela resolve a maioria dos casos, mas ainda precisa de ajustes finos. Eu adicionei uma camada extra que detecta se o locale é britânico ou americano e insere os "and"s nas posições corretas. Para valores com zeros intermediários, eu faço uma varredura prévia removendo grupos de zeros antes de chamar o conversor.
from num2words import num2words
def convert_to_english_words(value, currency="USD", locale="en_US"):
tratamento de zeros intermediários
parts = str(value).split(".")
integer_part = parts[0].rstrip("0") or "0"
if locale == "en_GB":
dollars = num2words(int(integer_part), to="number", lang="en_GB")
dollars = dollars.replace(" and ", ", ")
dollars = " ".join(d dollars.split())
else:
dollars = num2words(int(integer_part), to="number", lang="en_US")
if len(parts) == 2:
cents = int(parts[1].ljust(2, "0")[:2])
cents_str = f" and {num2words(cents, to='number', lang='en_US')} cents"
else:
cents_str = ""
curr = "dollars" if currency == "USD" else "pounds"
return f"{dollars} {curr}{cents_str}"
Pegadinhas que ninguém conta
Cifras vs. centavos com um dígito. Valor 0,05 dólares vira "five cents", mas o mesmo valor formatado como 0,50 vira "fifty cents". Se você simplesmente pegar os dois dígitos após o ponto sem padronizar, vai transformar 0,5 em "five cents" e cometer um erro de dez vezes. Sempre padding com zero à direita antes de converter a parte decimal. Números negativos. Muitas bibliotecas convertem "-1500" como "minus one thousand five hundred dollars" e outras como "negative one thousand five hundred dollars". Em contratos, a escolha pode importar. A convenção jurídica americana prefere "negative", mas alguns sistemas bancários exigem "minus". Verifique antes de integrar.
Million vs. Billion — engano clássico. O inglês americano e o britânico moderno usam a mesma escala curta (thousand, million, billion = mil milhões), mas documentos mais antigos ou de instituições europeias podem esperar a escala longa. Se seu documento é para um tribunal ou banco europeu, confirme qual escala eles adotam. O erro mais comum é chamar "mil milhões" de "billion" quando o contexto exige "thousand million".
Alternativas se você não quer programar
Se o volume de conversões for baixo, planilhas do Excel com a função nativa de numeração por extenso em inglês ajudam. No entanto, o Excel só suporta até trilhões e não lida bem com centavos como texto. Para volumes maiores, eu recomendo um serviço REST simples que você hospeda internamente, expondo um endpoint que recebe valor e moeda e devolve o texto formatado. Isso elimina dependência de ferramentas de terceiros que podem mudar o comportamento sem aviso. O que eu aprendi na prática é que a conversão de números para texto em inglês parece trivial até o dia em que um auditor questiona um "and" que falta ou um centavo subtraído por um bug de arredondamento. O trabalho não está na conversão em si, mas em definir claramente as regras de cada contexto e testar com edge cases antes de confiar no resultado automático.