How to format double value for a given locale and number of decimal places?

java, number-formatting

Solution

If you care to read NumberFormat's documentation, the solution would be obvious:

double d1 = 123456.78;
double d2 = 567890;
// self commenting issue, the code is easier to understand
Locale fmtLocale = Locale.getDefault(Category.FORMAT);
NumberFormat formatter = NumberFormat.getInstance(fmtLocale);
formatter.setMaximumFractionDigits(2);
formatter.setMinimumFractionDigits(2);
System.out.println(formatter.format(d1));
System.out.println(formatter.format(d2));
System.out.println(fmtLocale.toLanguageTag());

On my machine this prints out:

123 456,78 567 890,00 pl-PL

I believe this is what you are looking for, and you don't have to mess-up with patterns. I wouldn't do that - for instance there are locales which group digits by two, not by three (this is the reason we talk about grouping separator and not thousands separator).

Problem

How can I use `NumberFormat` to format a `double` value for a given `Locale` (default locale is sufficient) and for a given number of decimal places? For example, I have these values: ``` double d1 = 123456.78; double d2 = 567890; ``` And I want to print them in the following way, for example with US locale and 2 decimal places: ``` 123,456.78 567,890.00 ``` I don't actually care about rounding mode in this case, because these double values are gained from a `BigDecimal` with the given scale, so their number of decimal places is always lesser or equal than the number of decimal places I want to print. Edit: To make things a bit more clear, the thing is that I want to display money in a locale dependent way, but with a fixed number of decimal places. The example above showed, how the values should be formatted if the system locale is `en_US`. Now lets say, the system locale is `cs_CZ` (Czech), so the same numbers should be formatted in this way: ``` 123 456,78 567 890,00 ``` Now, how can I set up a NumberFormat to always display 2 decimal places, but to display thousands separator and decimal point based on the current locale?

Original source