logo search
Хабибуллин

Форматированный вывод

На технологию Java традиционно переходит очень много программистов, прежде писавших программы на языке С. Им очень не хватает функции printf(), позволяющей самому программисту как-то оформить вывод информации: задать количество цифр при выводе вещественных чисел, точно указать количество пробелов между данными. Начиная с JDK 1.5 методы printf(), очень похожие на одноименные функции языка С, появились в классах PrintStream и PrintWriter. Кроме них, в эти классы введены методы format(), выполняющие те же действия. Последние методы заимствованы из класса Formatter, находящегося в пакете java.util и специально предназначенного для форматирования.

Заголовки методов форматированного ввода/вывода класса PrintStream выглядят так:

PrintStream format(Local l, String format, Object ... args);

PrintStream format(String format, Object ... args);

PrintStream printf(Local l, String format, Object ... args);

PrintStream printf(String format, Object ... args);

В классе PrintWriter такие же методы возвращают ссылку на свой экземпляр класса

PrintWriter.

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

Строка символов format описывает шаблон для вывода данных, перечисленных в следующих аргументах метода, а также содержит надписи, которые должны появиться на консоли. Например, тот же самый вывод на консоль, который мы до сих пор делали методом

System.out.println("x = " + x + ", y = " + y);

можно сделать методом

System.out.printf("x = %d, y = %d\n", x, y);

В строке формата мы пишем поясняющий текст "x = , y = \n", который будет просто выводиться на консоль. В текст вставляем спецификации формата "%d". На место этих спецификаций во время вывода будут подставлены значения данных, перечисленных в следующих аргументах метода. Вместо первой спецификации появится значение первой переменной в списке, т. е. x, вместо второй — значение второй переменной, в нашем примере это переменная y, и т. д. Если знак процента надо вывести, а не понимать как начало спецификации, то его следует удвоить, например:

System.out.printf("Увеличение на %d%% процентов\n", x);

Если спецификаций окажется больше, чем данных в списке, то будет выброшено исключение класса MissingFormatArgumentException, если меньше, то последние данные, для которых "не хватило" спецификаций, просто не станут выводиться.

Если нужно изменить порядок вывода, то в спецификации можно явно написать порядковый номер выводимого аргумента, завершив его знаком доллара: %1$d, %2$d, %3$d. Например, если написать

System.out.printf("x = %2$d, y = %1$d\n", x, y);