Как форматировать двойное значение для данного языка и числа десятичных знаков?

Как я могу использовать 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();
    }