Como exibir adequadamente um preço de até dois decimais (centavos), incluindo zeros à direita em Java?
-
20-09-2019 - |
Pergunta
Há uma boa pergunta sobre o arredondamento de decimais em java aqui. Mas eu queria saber como posso incluir os zeros à direita para exibir preços no meu programa como: $ 1,50, $ 1,00
A solução simples de
String.format("%.2g%n", 0.912385);
Funciona bem, mas omite o zero à direita se estiver no último lugar decimal. A questão surge no meu programa, apesar de eu usar apenas expressões como esta:
double price = 1.50;
Quando faço cálculos com preços diferentes (adicione, multiplique etc.), o resultado é exibido principalmente assim:
$2.5000000000000003
Portanto, usar o string.format funciona bem para esse fim, mas trunca o exemplo acima
$2.5
Existe uma maneira adequada de mostrar o zero à direita no segundo lugar decimal? Ou ambos os zeros se a saída de um cálculo deve ser
$2.00
Solução
Eu recomendaria que você faça isso:
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
double price = 2.50000000000003;
System.out.println(currencyFormatter.format(price));
Isso também tem a virtude do BE Specific. Isso funcionará, por exemplo, se você estiver na zona do euro em vez dos EUA.
Outras dicas
Enquanto outras respostas são perfeitamente válidas (especialmente o de Duffymo), você tem um problema muito maior do que formatar a tela. Você está realmente usando um totalmente errado tipo para uma quantia em dinheiro que é um discreto valor. Em vez de um double
, você realmente deve considerar usar um java.lang.BigDecimal
.
(Editar: ... ou uma aula de dinheiro bem implementada como Duffymo apontou em um comentário, por exemplo, aulas do JSCIENCE'S monetário módulo ou o mais recente Joda-Money - que ainda precisa ser lançado como uma versão oficial.)
Provavelmente pode ser feito com string.format (...), mas você pode usar DecimalFormat
:
double price = 2.50000000000003;
DecimalFormat formatter = new DecimalFormat("$0.00");
System.out.println(formatter.format(price)); // print: $2.50
Você tentou:
String s = String.format("$%.2f", 2.50);
Isso será o suficiente.
public static String getFormattedData(String actualString)
{
String subString = "0.0";
if(actualString.contains("."))
{
subString = actualString.substring(actualString.indexOf("."), actualString.trim().length());
if(Double.parseDouble(subString) > 0.0)
return actualString;
else
actualString = actualString.substring(0, actualString.indexOf("."));
}
return actualString;
}