Почему шаблон 33333.## ведет себя так странно, когда мы используем метод DecimalFormat .format()?

Вчера я попытался самостоятельно изучить поведение метода DecimalFormat .format() со всеми его заполнителями и их действиями.
Итак, я написал два числа и испробовал на них разные шаблоны. С помощью «#.##» все незначащие нули были вырезаны, а с «0000.00» метод добавил начальные нули перед числом. Это было нормально, но затем я попробовал несколько странных шаблонов, просто чтобы посмотреть, что произойдет.
С шаблоном "33333.##" окончательный результат был действительно странным. Вы могли видеть мой код ниже:

DecimalFormat df = new DecimalFormat("33332.##");
double a= 222.46705219;
double b=-102.000;

System.out.println(df.format(a));
System.out.println(df.format(b));

И его вывод был:

 33332222,47
-33332102,0   

Тот же ввод, что и числа, но с использованием шаблона «33033.##» дал результат:

33222,4732
33102

Я понимаю, что программа добавила отформатированное число вместо 0, но почему, когда ноль не представлен в качестве заполнителя, метод по-прежнему округляет первое и (очевидно) второе число?
Почему мое первое число было округлено до второго цифра как должна быть, а второе число (b) напечатано с нулем в конце?
И почему, когда в середине "33033.##" ставится 0-заполнитель, программа вставляет отформатированное число a на своем месте, но не печатает "33" в конце числа b?
Я действительно не знаю, как объяснить такое поведение.


person Savina Dimitrova    schedule 30.09.2017    source источник


Ответы (1)


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

33332.##: 33332 рассматривается как префикс, а остаток, .##, недействителен, поскольку перед десятичной точкой требуется либо 0, либо #.

33033.##: 33 рассматривается как префикс, оставляя 033.##. Учитывая, что 0, . и # не могут быть частью какого-либо префикса или суффикса, а 3 может быть только частью префикса или суффикса, этот шаблон недействителен.

person Joe C    schedule 30.09.2017
comment
Да, я знаю, что они недействительны, но это не объясняет, почему каждый шаблон обрабатывает число a иначе, чем число b. Посмотрите на примеры - почему шаблон 33332.## печатает a с форматированием по второму знаку после десятичного разделителя, а b с форматированием по первому? - person Savina Dimitrova; 30.09.2017
comment
Я пытаюсь сказать, что, поскольку это неверно, результат непредсказуем. Это может быть по любому количеству причин, и нет оснований полагать, что это не изменится без предупреждения. - person Joe C; 30.09.2017