4

I am trying to format a double to exact 2 decimal places if it has fraction, and cut it off otherwise using DecimalFormat

So, I'd like to achieve next results:

100.123 -> 100.12
100.12  -> 100.12
100.1   -> 100.10
100     -> 100

Variant #1

DecimalFormat("#,##0.00")

100.1 -> 100.10
but
100   -> 100.00

Variant #2

DecimalFormat("#,##0.##")

100   -> 100
but
100.1 -> 100.1

Have any ideas what pattern to choose in my case?

repitch
  • 1,858
  • 1
  • 15
  • 34
  • 1
    Possible duplicate of [How to round a number to n decimal places in Java](http://stackoverflow.com/questions/153724/how-to-round-a-number-to-n-decimal-places-in-java) – piyushj Sep 01 '16 at 09:24

2 Answers2

4

The only solution i reached is to use if statement like was mentioned here: https://stackoverflow.com/a/39268176/6619441

public static boolean isInteger(BigDecimal bigDecimal) {
    int intVal = bigDecimal.intValue();
    return bigDecimal.compareTo(new BigDecimal(intVal)) == 0;
}

public static String myFormat(BigDecimal bigDecimal) {
    String formatPattern = isInteger(bigDecimal) ? "#,##0" : "#,##0.00";
    return new DecimalFormat(formatPattern).format(bigDecimal);
}

Testing

myFormat(new BigDecimal("100"));   // 100
myFormat(new BigDecimal("100.1")); // 100.10

If someone knows more elegant way, please share it!

Community
  • 1
  • 1
repitch
  • 1,858
  • 1
  • 15
  • 34
0

I believe we need an if statement.

static double intMargin = 1e-14;

public static String myFormat(double d) {
    DecimalFormat format;
    // is value an integer?
    if (Math.abs(d - Math.round(d)) < intMargin) { // close enough
        format = new DecimalFormat("#,##0.##");
    } else {
        format = new DecimalFormat("#,##0.00");
    }
    return format.format(d);
}

The margin allowed for a number to be regarded as an integer should be chosen according to the situation. Just don’t assume you will always have an exact integer when you expect one, doubles don’t always work that way.

With the above declaration myFormat(4) returns 4, myFormat(4.98) returns 4.98 and myFormat(4.0001) returns 4.00.

Ole V.V.
  • 81,772
  • 15
  • 137
  • 161
  • I also had an idea to use if statement, but hoped that it can be solved more gracefully, using DecimalFormat with specific pattern. – repitch Sep 01 '16 at 16:30
  • You can make a subclass of `DecimalFormat` and put the if statement inside the subclass. Not sure I really like the idea, though. – Ole V.V. Sep 01 '16 at 17:27