... кажется логичным получить выходные данные 12 или 23 ...
Нет. Сожалею. Ошибка. Неверное мышление.
Метод printf
ведет себя в соответствии с тем, что говорит его спецификация, а не с тем, что вам «кажется логичным» 1 .
Javadoc говорит это:
"Спецификаторы формата для общего, символьного и числового типов имеют следующий синтаксис:
%[argument_index$][flags][width][.precision]conversion
Необязательная точность - неотрицательное десятичное целое число, обычно используемое для ограничения количества символов. Конкретное поведение зависит от конверсии.
Байт, Короткое, Целое и Длинное
[Для всех преобразований ...]
Точность не применима . Если указана точность, будет выброшено IllegalFormatPrecisionException
. "
Дальнейшее чтение javadocs для Formatter
показывает, что форматы %d
не поддерживают "усечение" цифр целого числа.
... почему они решили сделать это ошибкой?
Потому что явная ошибка времени выполнения, сообщающая, что в вашем коде есть ошибка, лучше, чем приложение, выдающее неожиданные результаты, которые могут ускользнуть от вашего тестирования и других процессов контроля качества.
1 - По моему мнению, то, что вы предлагаете, нелогично, а не логично. Так чья «логика» должна победить? Ни! Вы должны читать спецификацию, а не предполагать, что все работает так, как вы думаете, должно работать. Обратите внимание, что этот принцип применяется ко всем действиям по программированию. Если сомневаетесь, прочитайте спецификацию!