Moeda (real)
Formatação, leitura e escrita por extenso de valores em reais.
Formatar
- JavaScript, biblioteca
- Python, biblioteca37 casos falham
- Go, biblioteca4 casos falham
- Ruby, biblioteca15 casos falham
- Rust, biblioteca
- .NET, biblioteca3 casos falham
- Erlang, biblioteca
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ãofalse) põe o prefixoR$no resultado (-R$ 1,50para um negativo).options.precisiondefine 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.parsea lê, exceto que um valor sem nenhum separador vale unidades inteiras (1234é formatado como1.234,00). - Uma string sem nenhum dígito vale 0:
abce a string vazia são formatadas como0,00, enulltambém resulta em0,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 porNumber(), entãotrueé formatado como1,00e[]como0,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âmetro | Tipo | Obrigatório |
|---|---|---|
value | string | number | sim |
options | FormatCurrencyOptions | não |
options.symbol | boolean | não |
options.precision | number | não |
| retorna | string |
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ãofalse) prefixa o resultado comR$;precision(padrão 2) define as casas decimais, limitada de 0 a 20. - Uma
stringé lida comoparseCurrencya lê, com uma diferença: um valor sem nenhum separador permanece em unidades inteiras, então'1234'vira1.234,00. - Retorna
''para um valor não finito ou que não pode ser convertido em número. Uma string é lida porparseCurrency, então uma string sem nenhum dígito é lida como0e formata como0,00('abc'), enulltambé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 ..
Teste com JavaScript formatCurrency
Casos de teste compartilhados (76) e o resultado em cada biblioteca currency.format
Interpretar
- JavaScript, biblioteca
- Python, biblioteca
- Go, biblioteca4 casos falham
- Ruby, biblioteca3 casos falham
- Rust, biblioteca1 caso falha
- .NET, biblioteca5 casos falham
- Erlang, biblioteca
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 em1,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ígitos15e 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âmetro | Tipo | Obrigatório |
|---|---|---|
value | string | sim |
options | ParseCurrencyOptions | não |
options.precision | number | não |
| retorna | number |
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-'viram1, e os caracteres que não são dígitos nem separadores são descartados, então'1e5'vira0.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(''); // 0Fonte: 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 ..
Teste com JavaScript parseCurrency
Casos de teste compartilhados (39) e o resultado em cada biblioteca currency.parse
Escrever por extenso
- JavaScript, biblioteca
- Python, biblioteca31 casos falham
- Go, biblioteca7 casos falham
- Ruby, biblioteca2 casos falham
- Rust, biblioteca6 casos falham
- .NET, biblioteca5 casos falham
- Erlang, biblioteca
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âmetro | Tipo | Obrigatório |
|---|---|---|
value | number | sim |
| retorna | string |
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)Teste com JavaScript convertCurrencyToWords
Casos de teste compartilhados (31) e o resultado em cada biblioteca currency.convertToWords
Fontes oficiais
Veja também Números por extenso
Atualizado em
