Moeda (real)

Formatação, leitura e escrita por extenso de valores em reais.

  • Matriz de paridade

Formatar

Formata um número no padrão BRL 1.234,56.

  • Um número mantém o sinal e as casas decimais. options.symbol (padrão false) põe o prefixo R$ no resultado (-R$ 1,50 para um negativo). options.precision define as casas decimais (padrão 2, limitado de 0 a 20; uma precisão que não é um número finito vale 2).
  • A função lê uma string como currency.parse a lê, exceto que um valor sem nenhum separador vale unidades inteiras (1234 é formatado como 1.234,00).
  • Uma string sem nenhum dígito vale 0: abc e a string vazia são formatadas como 0,00, e null também resulta em 0,00. Um valor que não é um número finito (NaN, infinito) ou não pode ser convertido em número (um symbol, um objeto simples) retorna uma string vazia. Qualquer outro valor que não é string passa por Number(), então true é formatado como 1,00 e [] como 0,00.

Decisão pendente

A referência (JS) não adiciona símbolo de moeda por padrão (o prefixo R$ é opcional, via options.symbol). As outras bibliotecas usam o prefixo R$ . Veja a decisão em aberto em docs/findings.md (em inglês).

Decisão pendente

Para um valor não finito ou não numérico, a referência (JS) retorna uma string vazia. Outras bibliotecas retornam null. Veja a decisão em aberto em docs/findings.md (em inglês).

ParâmetroTipoObrigatório
valuestring | numbersim
optionsFormatCurrencyOptionsnão
options.symbolbooleannão
options.precisionnumbernão
retornastring

Formata um número ou uma string numérica no padrão BRL (1.234,56). Um number é formatado como está, com sinal e decimais preservados.

  • Opções (FormatCurrencyOptions): symbol (padrão false) prefixa o resultado com R$; precision (padrão 2) define as casas decimais, limitada de 0 a 20.
  • Uma string é lida como parseCurrency a lê, com uma diferença: um valor sem nenhum separador permanece em unidades inteiras, então '1234' vira 1.234,00.
  • Retorna '' para um valor não finito ou que não pode ser convertido em número. Uma string é lida por parseCurrency, então uma string sem nenhum dígito é lida como 0 e formata como 0,00 ('abc'), e null também dá 0,00.
import { formatCurrency } from '@brazilian-utils/brazilian-utils';

formatCurrency(10); // 10,00
formatCurrency(10756.11); // 10.756,11
formatCurrency(10756.123, { precision: 3 }); // 10.756,123
formatCurrency(1234.56, { symbol: true }); // R$ 1.234,56
formatCurrency(-1050); // -1.050,00 (o sinal de um number é preservado)
formatCurrency('123456'); // 123.456,00 (dígitos simples são lidos como número inteiro)
formatCurrency('1.234,56'); // 1.234,56 (o último "," ou "." seguido de 1 a 2 dígitos é o separador decimal)
formatCurrency('-10.5'); // -10,50 (o "-" inicial é preservado)
formatCurrency(Number.NaN); // "" (números não finitos viram string vazia)

Fonte: Lei nº 9.069/1995, art. 1º, que define o símbolo R$ e a vírgula antes dos centavos. Baseado em: os dados de locale pt-BR do CLDR por trás do Intl.NumberFormat, para o agrupamento com ..

Código: brazilian-utils/javascript
Teste com JavaScript formatCurrency
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (76) e o resultado em cada biblioteca currency.format

Interpretar

Converte uma string de valor em BRL (por exemplo, R$ 1.234,56) em número.

  • O último , ou . seguido de 1 a 2 dígitos (até options.precision, quando maior) é o separador decimal. Todo outro , ou . é separador de milhar.
  • A função lê um valor sem nenhum separador como centavos (dividido por 10 elevado à precisão, padrão 2).
  • Só um - antes do primeiro dígito torna o resultado negativo (-R$ 1,00 é -1). Um negativo contábil como (R$ 1,00) ou um sinal no fim, como em 1,00-, resulta em 1. Uma string vazia vale 0.
  • Todo caractere que não é dígito nem separador é descartado, então 1e5 é lido como os dígitos 15 e resulta em 0.15.
  • options.precision (padrão 2, limitado de 0 a 20) é o número de dígitos lidos como unidades menores: o divisor de um valor sem separador e o maior grupo decimal. Uma precisão que não é um número finito vale 2.
ParâmetroTipoObrigatório
valuestringsim
optionsParseCurrencyOptionsnão
options.precisionnumbernão
retornanumber

Converte uma string de moeda no padrão BRL em número.

  • Opções (ParseCurrencyOptions): precision (padrão 2) é a quantidade de dígitos lidos como subunidades monetárias, limitada de 0 a 20.
  • O último , ou . seguido de 1 a 2 dígitos (até precision, quando maior) é o separador decimal; todo outro , ou . é separador de milhar.
  • Um valor sem nenhum separador é lido como centavos e dividido por 10 ** precision.
  • Só um - antes do primeiro dígito torna o resultado negativo: '(R$ 1,00)' e '1,00-' viram 1, e os caracteres que não são dígitos nem separadores são descartados, então '1e5' vira 0.15.
import { parseCurrency } from '@brazilian-utils/brazilian-utils';

parseCurrency('R$ 1.234,56'); // 1234.56
parseCurrency('1234,56'); // 1234.56
parseCurrency('R$ 0,50'); // 0.5
parseCurrency('R$ 1.234'); // 1234 ("." seguido de 3 dígitos é separador de milhar)
parseCurrency('1,5'); // 1.5
parseCurrency('1234'); // 12.34 (sem nenhum separador, vale a convenção de centavos)
parseCurrency('-R$ 1,00'); // -1 (o "-" inicial é preservado)
parseCurrency('R$ 1,001', { precision: 3 }); // 1.001
parseCurrency(''); // 0

Fonte: Lei nº 9.069/1995, art. 1º, que define o símbolo R$ e a vírgula antes dos centavos. Baseado em: os dados de locale pt-BR do CLDR por trás do Intl.NumberFormat, para o agrupamento com ..

Código: brazilian-utils/javascript
Teste com JavaScript parseCurrency
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (39) e o resultado em cada biblioteca currency.parse

Escrever por extenso

Escreve um valor em reais por extenso, em português do Brasil, como em cheques e contratos.

Por exemplo, 1523.45 vira "mil quinhentos e vinte e três reais e quarenta e cinco centavos".

  • A função trunca value (não arredonda) para 2 casas decimais.
  • Singular e plural concordam ("um real", "um centavo", "zero reais"). Todo outro valor usa o plural ("dois reais", "um milhão e um reais").
  • A função coloca "menos" antes de um valor negativo, exceto quando o valor trunca para nada: -0.001 é "zero reais".
  • A função não recebe opções. Um milhão, bilhão ou trilhão redondo de reais leva "de" ("um milhão de reais"), e os centavos, quando há, vêm depois ("um bilhão de reais e cinquenta centavos").
  • Acima de cerca de 90 trilhões de reais (Number.MAX_SAFE_INTEGER / 100) um número não comporta centavos, então o valor é lido como reais inteiros. Os centavos são lidos da notação decimal do valor, então o ruído de ponto flutuante não os altera (1.15 é "um real e quinze centavos").

Decisão pendente

A referência (JS) escreve tudo em minúsculas, sem vírgula entre os grupos. Várias bibliotecas põem a primeira palavra em maiúscula e algumas adicionam vírgulas. Veja a decisão em aberto em docs/findings.md (em inglês).

Decisão pendente

Para entrada inválida ou valor acima de 999 trilhões de reais, a referência (JS) retorna uma string vazia. Veja a decisão em aberto em docs/findings.md (em inglês).

ParâmetroTipoObrigatório
valuenumbersim
retornastring

Escreve um valor em reais por extenso, como em cheques e contratos: 1523.45 vira "mil quinhentos e vinte e três reais e quarenta e cinco centavos". Não recebe opções.

  • O value é truncado (não arredondado) para 2 casas decimais.
  • Retorna "" para uma entrada inválida ou um valor acima de 999 trilhões de reais.
  • O singular vale para exatamente um ("um real", "um centavo"), e um milhão, bilhão ou trilhão redondo de reais leva "de": "um milhão de reais".
  • Um valor que trunca para nada é "zero reais", mesmo se negativo (-0.001); qualquer outro valor negativo recebe o prefixo "menos".
  • Acima de cerca de 90 trilhões de reais (Number.MAX_SAFE_INTEGER / 100) um número não guarda centavos, então o valor é lido como reais inteiros.
import { convertCurrencyToWords } from '@brazilian-utils/brazilian-utils';

convertCurrencyToWords(1523.45); // "mil quinhentos e vinte e três reais e quarenta e cinco centavos"
convertCurrencyToWords(1); // "um real"
convertCurrencyToWords(0.01); // "um centavo"
convertCurrencyToWords(1000000); // "um milhão de reais"
convertCurrencyToWords(0); // "zero reais"
convertCurrencyToWords(-5.5); // "menos cinco reais e cinquenta centavos"
convertCurrencyToWords(-0.001); // "zero reais" (trunca para nada)
Código: brazilian-utils/javascript
Teste com JavaScript convertCurrencyToWords
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (31) e o resultado em cada biblioteca currency.convertToWords

Fontes oficiais

Veja também Números por extenso

Atualizado em

Nesta página