denchr
denchr

Reputation: 4262

How to properly display a price up to two decimals (cents) including trailing zeros in Java?

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

Upvotes: 6

Views: 29751

Answers (5)

Shiva
Shiva

Reputation: 1

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;
    }

Upvotes: 0

Pascal Thivent
Pascal Thivent

Reputation: 570545

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.)

Upvotes: 14

duffymo
duffymo

Reputation: 308988

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.

Upvotes: 20

dustmachine
dustmachine

Reputation: 10824

Have you tried:

String s = String.format("$%.2f", 2.50);

That will do the trick.

Upvotes: 4

Bart Kiers
Bart Kiers

Reputation: 170278

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

Upvotes: 11

Related Questions