Как форматировать двойное значение для данного языка и числа десятичных знаков?
Как я могу использовать NumberFormat
для форматирования значения double
для заданного Locale
(обычно используется локаль по умолчанию) и для заданного количества десятичных знаков?
Например, у меня есть следующие значения:
double d1 = 123456.78;
double d2 = 567890;
И я хочу напечатать их следующим образом, например, с помощью US locale и 2 десятичных знаков:
123,456.78
567,890.00
В этом случае я действительно не забочусь о режиме округления, потому что эти двойные значения получены из BigDecimal
с заданным масштабом, поэтому их количество десятичных знаков всегда меньше или равно числу десятичных знаков я хотите распечатать.
Edit:
Чтобы сделать вещи более ясными, дело в том, что я хочу отображать деньги в зависимости от языка, но с фиксированным числом десятичных знаков. В приведенном выше примере показано, как значения должны быть отформатированы, если локаль системы en_US
. Теперь скажем, что языковой стандарт системы cs_CZ
(чешский), поэтому одинаковые номера должны быть отформатированы следующим образом:
123 456,78
567 890,00
Теперь, как я могу настроить NumberFormat для отображения всего 2 десятичных знаков, но для отображения разделителей тысяч и десятичной точки на основе текущей локали?
Ответы
Ответ 1
Если вы хотите прочитать документацию NumberFormat, решение будет очевидно:
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());
На моей машине это выдает:
123 456,78
567 890,00
PL-PL
Я считаю, что это то, что вы ищете, и вам не нужно испортить шаблоны. Я бы этого не сделал - например, есть локали, которые группируют цифры на два, а не на три (это причина, по которой мы говорим о разделителе группировки и не разделителе тысяч)..
Ответ 2
Адаптировано из Настройка форматов,
public void localizedFormat(double value,Locale loc ) {
NumberFormat nf = NumberFormat.getNumberInstance(loc);
DecimalFormat df = (DecimalFormat)nf;
df.applyPattern("###,###.00");
String output = df.format(value);
}
Эта функция должна предоставить необходимое форматирование.
Ответ 3
Вы можете использовать что-то вроде
DecimalFormat formatter = (DecimalFormat) DecimalFormat.getInstance();
formatter.applyPattern("#,###,##0.00");
formatter.format(yourDoubleHere)
Ответ 4
преобразует двойное значение в двойное значение с любым числом цифр после десятичного числа.
Я создал этот метод в классе Utility для доступа к нему через проект.
public static double convertToDecimal(double doubleValue, int numOfDecimals) {
BigDecimal bd = new BigDecimal(doubleValue);
bd = bd.setScale(numOfDecimals, BigDecimal.ROUND_HALF_UP);
return bd.doubleValue();
}