Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Класс PrintStream

Класс PrintStream предоставляет все возможности, которые знакомы по System.out. Поддерживает методы print(), println() и printf().

Методы print() и println()

Очень часто программисты используют методы print() и println() для временной отладки. Особо говорить о них нечего.

Метод printf()

При сложном выводе строки удобнее её сначала отформатировать, чтобы результат выглядел красивым. Допустим, мы хотим распечатать таблицу умножения от 1 до 10. В качестве разделителя будем использовать символ табуляции


int[][] multiplyTable = new int[10][10];

for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        multiplyTable[i][j] = (i + 1) * (j + 1);
        // используем символ табуляции
        System.out.print(multiplyTable[i][j] + "\t");
    }
    System.out.println();
}

Результат.


1	2	3	4	5	6	7	8	9	10	
2	4	6	8	10	12	14	16	18	20	
3	6	9	12	15	18	21	24	27	30	
4	8	12	16	20	24	28	32	36	40	
5	10	15	20	25	30	35	40	45	50	
6	12	18	24	30	36	42	48	54	60	
7	14	21	28	35	42	49	56	63	70	
8	16	24	32	40	48	56	64	72	80	
9	18	27	36	45	54	63	72	81	90	
10	20	30	40	50	60	70	80	90	100

Таблица получилась не слишком аккуратной. Заменим одну строку кода.


System.out.printf("%4d", multiplyTable[i][j]);

Результат.


   1   2   3   4   5   6   7   8   9  10
   2   4   6   8  10  12  14  16  18  20
   3   6   9  12  15  18  21  24  27  30
   4   8  12  16  20  24  28  32  36  40
   5  10  15  20  25  30  35  40  45  50
   6  12  18  24  30  36  42  48  54  60
   7  14  21  28  35  42  49  56  63  70
   8  16  24  32  40  48  56  64  72  80
   9  18  27  36  45  54  63  72  81  90
  10  20  30  40  50  60  70  80  90 100

Таблица стала компактнее, кроме того числа выравнены по последней цифре и визуально смотрится гораздо красивее.

Выражение %4d является шаблоном, который выделил четыре места под выводимое число. Но есть и другие способы форматирования строки.

В предыдущем примере d означает вывод десятичного целого числа, а 4 — означает то, что если количество знаков в числе меньше, чем 4, то оно будет спереди дополнено пробелами на недостающее количество знаков. % — специальный символ, обозначающий начало инструкции форматирования.

Усложним пример, написав страшный код.


System.out.printf("%5d%n%5d%n%5d%n%5d%n%5d", 55555, 4444, 333, 22, 1);

Результат.


55555
 4444
  333
   22
    1

Выражение %5d уже знакомо - мы форматируем имеющиеся числа, выделяя по пять мест. Выражение %n означает перевод строки. Тем самым мы получили лесенку. Можно догадаться, что после первого параметра идут данные из массива, которые подставляются вместо выражения. Перевернём строку.


System.out.printf("%5d%n%5d%n%5d%n%5d%n%5d", 1, 22, 333, 4444, 55555);

    1
   22
  333
 4444
55555

Рассмотрим пример с числом с плавающей точкой.


System.out.printf("%1$+010.5f", Math.PI);

+003.14159
  • 1$ — данный формат применяется к первому аргументу, который находится после строки форматирования. В данном примере это было указывать не обязательно
  • +0 — недостающие (до 10-ти) символы будут заполнены нулями, перед числом будет указан знак (+)
  • 10 — всего выведенное число будет иметь ширину в 10 символов
  • .5 — выведенное число будет содержать 5 знаков после запятой
  • f — выводим число с плавающей точкой. По умолчанию шесть символов после запятой

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


int i = 5;
double root;
root = Math.sqrt(i);
System.out.printf("Корень числа %d равен %.3f", i, root);

// Выводится
Корень числа 5 равен 2.236

Программа встречает первую инструкцию и применяет к первому элементу массива (i), затем вторая инструкция применяется ко второму элементу root.

Очень большое целое число можно разбить на разряды. Тут есть одна особенность. Во многих странах используют разные способы разбивки. Например, в России считается стандартом разбивка при помощи запятой, а во Франции через пробелы. По умолчанию используется локаль системы. Можно переопределить локаль, чтобы получить нужный результат.


System.out.printf(Locale.FRANCE,"%,d", 1000000000);

// Выводится
1 000 000 000

Мы выводили числа с пробелами спереди. Пробелы можно заменить на нули.


System.out.printf("%3d", 3); // три места под число, дополняются пробелами
System.out.println();
System.out.printf("%03d", 3); // три места под число, дополняются нулями

// Выводится
  3
003

Можно добавить плюс (уже использовали) или выравнивать число пробелами по левой стороне.


System.out.printf("%+3d", 3); // выводим плюсик и три места под число
System.out.println();
System.out.printf("%-3d", 3); // три места под число, пробелы справа после числа
System.out.print(1);

// Результат
 +3
3  1

Кроме чисел можно форматировать строки. Используется символ s.


System.out.printf("А у нас сегодня %s родила вчера %s", "кошка", "котят");

// Результат
А у нас сегодня кошка родила вчера котят

"%10s%n" - если строка содержит менее 10 символов, то будет дополнена пробелами слева.

"%-10s%n" - если строка менее 10 символов, то будет дополнена пробелами справа на недостающее количество символов.

Выводим три первых символа.


System.out.printf("%.3s", "Котелок");

Кстати, эти же правила форматирования используются в методе String.format(). Там можно найти другие символы форматирования для дат, шестнадцатеричных систем, верхнего регистра и т.д.

Реклама