How to properly display a price up to two decimals (cents) including trailing zeros in Java?
-
20-09-2019 - |
Question
There is a good question on rounding decimals in Java here. But I was wondering how can I include the trailing zeros to display prices in my program like: $1.50, $1.00
The simple solution of
String.format("%.2g%n", 0.912385);
works just fine, but omits the trailing zero if it is at the last decimal place. The issue comes up in my program even though I only use expressions like this:
double price = 1.50;
When I do calculations with different prices (add, multiply, etc.) the result is primarily displayed like this:
$2.5000000000000003
So, using the String.format works fine for this purpose, but it truncates the above example to
$2.5
Is there a proper way to show the trailing zero at the second decimal place? Or both zeros if the output of a calculation should be
$2.00
Solution
I would recommend that you do this:
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
double price = 2.50000000000003;
System.out.println(currencyFormatter.format(price));
This has the virtue of be locale-specific as well. This will work, for example, if you're in the euro zone instead of the US.
OTHER TIPS
While others answers are perfectly valid (especially duffymo's one), you have a much bigger problem than formatting the display. You are actually using a totally wrong type for a money amount which is a discrete value. Instead of a double
, you should really consider using a java.lang.BigDecimal
.
(EDIT: ... or a well implemented Money class as duffymo pointed out in a comment, for example classes from JScience's monetary module or the more recent Joda-Money - which has still to be released as an official version.)
It can probably be done with String.format(...), but you could use DecimalFormat
:
double price = 2.50000000000003;
DecimalFormat formatter = new DecimalFormat("$0.00");
System.out.println(formatter.format(price)); // print: $2.50
Have you tried:
String s = String.format("$%.2f", 2.50);
That will do the trick.
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;
}