Освой программирование играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Класс PrintStream предоставляет все возможности, которые знакомы по System.out. Поддерживает методы print(), println() и printf().
Очень часто программисты используют методы print() и println() для временной отладки. Особо говорить о них нечего.
При сложном выводе строки удобнее её сначала отформатировать, чтобы результат выглядел красивым. Допустим, мы хотим распечатать таблицу умножения от 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
На практике часто встречается вариант, когда в строку вставляются несколько выражений. Например, так.
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(). Там можно найти другие символы форматирования для дат, шестнадцатеричных систем, верхнего регистра и т.д.