How can I use NumberFormat
to format a double
value for a given Locale
(default locale is sufficient) and for a given number of decima
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).
Adapted from Customizing Formats,
public void localizedFormat(double value,Locale loc ) {
NumberFormat nf = NumberFormat.getNumberInstance(loc);
DecimalFormat df = (DecimalFormat)nf;
df.applyPattern("###,###.00");
String output = df.format(value);
}
This function should give you the required formatting.
You could use something like
DecimalFormat formatter = (DecimalFormat) DecimalFormat.getInstance();
formatter.applyPattern("#,###,##0.00");
formatter.format(yourDoubleHere)
converts a double value to a double value with any number of digits after decimal. I have created this method in a Utility class to access it through out the project.
public static double convertToDecimal(double doubleValue, int numOfDecimals) {
BigDecimal bd = new BigDecimal(doubleValue);
bd = bd.setScale(numOfDecimals, BigDecimal.ROUND_HALF_UP);
return bd.doubleValue();
}