Sei que é um exercício introdutório, mas ainda sim, acho que vale mencionar alguns pontos e aprofundar um pouco mais (o objetivo não é dizer que está errado, mas sim deixar um complemento que pode ser consultado depois, pois tudo sempre pode ser melhorado) :-)
Primeiro o arredondamento. Vale lembrar que toFixed
arredonda os valores, o que pode ou não ser desejado. Além disso, toFixed
retorna uma string (sei que o JavaScript faz coerções de tipo, mas se for usar TypeScript, por exemplo, deve ter esses detalhes em mente). Enfim, outra forma de truncar o valor para limitar a quantidade de casas decimais é ter uma função do tipo:
function truncar(valor, casas=2) {
var fator = 10 ** casas;
return Math.floor(valor * fator) / fator;
}
Assim ela não arredonda, veja a diferença:
var valor = 1.235;
console.log(valor.toFixed(2)); // toFixed arredonda: 1.24
console.log(truncar(valor, 2)); // agora não arredonda: 1.23
Quanto à formatação dos números, a linguagem já tem isso pronto. Basta usar o método toLocaleString
:
function truncar(valor, casas=2) {
var fator = 10 ** casas;
return Math.floor(valor * fator) / fator;
}
var valorEmDolar = 64;
var cotacaoDoDolar = 5.32;
var valorEmReal = truncar(valorEmDolar * cotacaoDoDolar);
var texto = valorEmDolar.toLocaleString('pt-BR', { style: 'currency', currency: 'USD', currencyDisplay: 'narrowSymbol' })
+ ' são '
+ valorEmReal.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL' });
console.log(texto); // $ 64,00 são R$ 340,48
O parâmetro pt-BR
indica o locale que corresponde ao português do Brasil. Assim, ele já vai usar a vírgula como separador decimal, eliminando a necessidade do replace
. Você pode usar outros, como por exemplo en-US
(inglês americano), que o separador decimal muda automaticamente para o ponto.
E as demais opções servem para formatar valores monetários. Basta mudar o currency
para a moeda desejada, que o respectivo símbolo será colocado. No caso do dólar, também adicionei o narrowSymbol
para que seja somente $
(sem isso, ele mostra US$
). Não deixe de ler a documentação para ver todas as opções possíveis.
E na verdade nem precisava da função truncar
. Quando usamos o style: 'currency'
, ele usa a quantidade de casas decimais definido pela ISO 4217 - veja que tanto real (BRL) quanto dólar (USD) usam dois dígitos.
Mas isso pode ser mudado usando propriedades adicionais. Por exemplo, no mercado financeiro é comum trabalhar com 3 casas decimais, então bastaria trocar para:
// mostra o valor com 3 casas decimais
valorEmReal.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL', minimumFractionDigits: 3, maximumFractionDigits: 3 });
E claro, vale a dica final, de que os números de ponto flutuante não são os mais adequados para valores monetários, devido a seus inúmeros problemas de precisão (Nubank que o diga). Mas aí é outra história...