Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 779
Natix Avatar asked May 02 '12 09:05

Natix


People also ask

How do you format a double to two decimal places?

Just use %. 2f as the format specifier. This will make the Java printf format a double to two decimal places.

How many decimal places does a double go to?

double is a 64-bit IEEE 754 double precision Floating Point Number – 1 bit for the sign, 11 bits for the exponent, and 52* bits for the value. double has 15 decimal digits of precision.

How do I get only 2 decimal places in C++?

We use the %. 2f format specifier to display values rounded to 2 decimal places.


1 Answers

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

like image 106
Paweł Dyda Avatar answered Sep 19 '22 05:09

Paweł Dyda