DecimalFormat игнорирует данный шаблон, но использует Locale

Я хочу отформатировать число по заданной строке формата, используя DecimalFormat. Это задокументировано в документах Oracle по Java.

public class DecimalFormatDemo {

   static public void customFormat(String pattern, double value ) {
     DecimalFormat myFormatter = new DecimalFormat(pattern);
     String output = myFormatter.format(value);
     System.out.println(value + "  " + pattern + "  " + output);
  }

  static public void main(String[] args) {
    customFormat("###,###.###", 123456.789);
   }
}

Но мой вывод - стиль немецкого формата на моей немецкой ОС:

actual: 123456.789  ###,###.###  123.456,789
expected: 123456.789  ###,###.###  123,456.789

Я знаю, что могу явно установить разделители. Но я хочу иметь возможность установить формат строкой, как в документах оракула. Это должно быть независимо от моей локали ОС.


person Matthias M    schedule 25.04.2017    source источник


Ответы (1)


Поскольку ваш язык по умолчанию — немецкий, вы получаете немецкий числовой формат. Если вы хотите изменить это, выберите другую локаль для числового формата, лежащего в основе вашего DecimalFormat.

Пример:

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
public class DecimalFormatDemo {

   static public void customFormat(String pattern, double value ) {

    NumberFormat nf1 = NumberFormat.getNumberInstance(Locale.ENGLISH);
    DecimalFormat df1 = (DecimalFormat)nf1;
    df1.applyPattern(pattern);
    String output = df1.format(value);
    System.out.println("Input: " + value + ", pattern: " + pattern + " output: " + output);


    NumberFormat nf2 = NumberFormat.getNumberInstance(Locale.GERMAN);
    DecimalFormat df2 = (DecimalFormat)nf2;
    df2.applyPattern(pattern);
    output = df2.format(value);
    System.out.println("Input: " + value + ", pattern: " + pattern + " output: " + output);

  }

  static public void main(String[] args) {
    customFormat("###,###.###", 123456.789);
   }
}

Вывод:

Input: 123456.789, pattern: ###,###.### output: 123,456.789
Input: 123456.789, pattern: ###,###.### output: 123.456,789
person Michael Peacock    schedule 25.04.2017