How can I change DecimalFormat behavior based on input length?
Asked Answered
C

2

8

I am using the following DecimalFormat pattern:

// Use ThreadLocal to ensure thread safety.
private static final ThreadLocal <NumberFormat> numberFormat =
  new ThreadLocal <NumberFormat>() {
    @Override protected NumberFormat initialValue() {
        return new DecimalFormat("#,##0.00");
    }
};

This performs the following conversions:

1    -> 1.00
1.1  -> 1.10
1.12 -> 1.12

I now have an additional requirement.

1.123  -> 1.123
1.1234 -> 1.123

That means that when

  • there are fewer than two decimal places, I will "pad" to two decimal places.
  • there are exactly two or three decimal places, I will do nothing.
  • there are more than three decimal places, I will truncate to three decimal places.

Can I specify this behavior with the DecimalFormat class?

Consecrate answered 13/12, 2010 at 13:16 Comment(0)
J
4
DecimalFormat("#,##0.00#")
Jeconiah answered 13/12, 2010 at 14:1 Comment(1)
That's is really an elegant solution!Consecrate
S
1

Have you tried to change the RoundingMode of your DecimalFormat instance?

Calling setRoundingMode(RoundingMode.FLOOR) should do the trick

See also setRoundingMode(java.math.RoundingMode)

Skeen answered 13/12, 2010 at 13:58 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.