How to use Java's DecimalFormat for "smart" currency formatting?

74,545

Solution 1

Does it have to use DecimalFormat?

If not, it looks like the following should work:

String currencyString = NumberFormat.getCurrencyInstance().format(currencyNumber);
//Handle the weird exception of formatting whole dollar amounts with no decimal
currencyString = currencyString.replaceAll("\\.00", "");

Solution 2

Use NumberFormat:

NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US); 
double doublePayment = 100.13;
String s = n.format(doublePayment);
System.out.println(s);

Also, don't use doubles to represent exact values. If you're using currency values in something like a Monte Carlo method (where the values aren't exact anyways), double is preferred.

See also: Write Java programs to calculate and format currency

Solution 3

Try

new DecimalFormat("'$'0.00");

Edit:

I Tried

DecimalFormat d = new DecimalFormat("'$'0.00");

        System.out.println(d.format(100));
        System.out.println(d.format(100.5));
        System.out.println(d.format(100.41));

and got

$100.00
$100.50
$100.41

Solution 4

Try using

DecimalFormat.setMinimumFractionDigits(2);
DecimalFormat.setMaximumFractionDigits(2);

Solution 5

You can try by using two different DecimalFormat objects based on the condition as follows:

double d=100;
double d2=100.5;
double d3=100.41;

DecimalFormat df=new DecimalFormat("'$'0.00");

if(d%1==0){ // this is to check a whole number
    DecimalFormat df2=new DecimalFormat("'$'");
    System.out.println(df2.format(d));
}

System.out.println(df.format(d2));
System.out.println(df.format(d3));

Output:-
$100
$100.50
$100.41
Share:
74,545
Peter
Author by

Peter

Updated on May 14, 2020

Comments

  • Peter
    Peter about 4 years

    I'd like to use Java's DecimalFormat to format doubles like so:

    #1 - 100 -> $100
    #2 - 100.5 -> $100.50
    #3 - 100.41 -> $100.41
    

    The best I can come up with so far is:

    new DecimalFormat("'$'0.##");
    

    But this doesn't work for case #2, and instead outputs "$100.5"

    Edit:

    A lot of these answers are only considering cases #2 and #3 and not realizing that their solution will cause #1 to format 100 as "$100.00" instead of just "$100".