Использование DecimalFormat с пользовательским шаблоном, но без форматирования локали - PullRequest
1 голос
/ 02 октября 2019

Я хотел бы использовать DecimalFormat с пользовательским шаблоном. Шаблон может быть установлен с помощью метода applyPattern (), но это не возможно для Numberformat, поэтому необходимо использовать DecimalFormat. Тем не менее, использование DecimalFormat невозможно без предоставления локали, и затем он использует настройку локали для применения паттерна, зависящего от локали, поверх пользовательского шаблона. Таким образом, в сущности, выход изменяется и больше не соответствует специфике предоставленного шаблона.

Дело уже рассматривалось ранее, но не было найдено решения, которое бы нас: DecimalFormat игнорирует данный шаблон, но использует Locale

Есть ли способ строго использоватьпользовательский шаблон без какой-либо автоматической магии форматирования локали? Благодарю.

1 Ответ

1 голос
/ 02 октября 2019

Позвольте мне сначала проверить, правильно ли я понимаю вашу проблему.

    double number = 123456.789;
    NumberFormat nf = new DecimalFormat("###,###.###");
    System.out.println(nf.format(number));

В этом коде используется язык FORMAT по умолчанию. Когда, например, мой стандарт по умолчанию установлен на немецкий, вывод будет:

123.456,789

Использовались символы немецкого формата: точка как разделитель тысяч изапятая как десятичная «точка». Вы не хотите этого.

Решение: Я обычно использую Locale.ROOT в качестве «нейтральной локали», как способ сказать «не выполняйте никакой специфичной для локали обработки»Вот". Здесь тоже работает. Измените экземпляр средства форматирования на:

    NumberFormat nf = new DecimalFormat("###,###.###", new DecimalFormatSymbols(Locale.ROOT));

Теперь вывод - все еще в немецкой локали - это:

123 456,789

Или корочеи, возможно, лучший способ получить тот же результат:

    NumberFormat nf = NumberFormat.getInstance(Locale.ROOT);

Нам не нужно беспокоиться о DecimalFormat, просто NumberFormat.

...