Кратко
- Синтаксис: System.out.printf("Привет, %s!%n", "Мир"). Первый аргумент это строка формата, дальше идут значения по порядку.
- Основные спецификаторы: %s строка, %d целое, %f дробное, %e научная нотация, %c символ, %b логическое значение.
- Между % и буквой ставят ширину и точность: %10s дополнит строку пробелами слева до 10 символов, %-10s выровняет по левому краю, %.2f оставит два знака после запятой.
- Разделитель дробной части зависит от локали: в русской локали %.2f напечатает 3,14, а в Locale.US 3.14. Локаль можно задать первым аргументом: System.out.printf(Locale.US, "%.2f", 3.14159).
- Перенос строки printf сам не добавляет: в конце пишут %n (системный перенос) или \n.
- Несовместимые флаг и спецификатор дают FormatFlagsConversionMismatchException во время выполнения, а не при компиляции: например, %+s.
Введение в функцию Java Printf
public PrintStream printf(String format, Object... args)
Обратите внимание: метод не статический, его вызывают у готового потока вывода (System.out), а возвращает он сам поток, поэтому вызовы можно писать цепочкой. Есть и второй вариант, которому первым аргументом передают локаль: printf(Locale l, String format, Object... args).
Функция Java printf принимает два аргумента:
- Строка формата: Эта строка содержит специальные символы форматирования, которые сообщают функции printf, как форматировать вывод.
- Переменное количество аргументов: Эти аргументы являются значениями, которые будут отформатированы и выведены.
System.out.printf("Привет, %s!\n", "Мир");
В этом примере строка формата содержит две части:
- Литеральный текст "Привет, ": Этот текст будет выведен буквально.
- Символ форматирования "%s": Этот символ говорит функции printf отформатировать следующий аргумент как строку.
- Аргумент "Мир": Это значение, которое будет отформатировано и выведено как строка.
Символы форматирования
Функция printf поддерживает множество символов форматирования, каждый из которых может использоваться для контроля внешнего вида вывода. Например, следующие символы форматирования можно использовать для форматирования самых популярных примитивных типов данных в Java:- %d: форматирует аргумент как целое число;
- %f: форматирует аргумент как число с плавающей точкой;
- %e: форматирует аргумент как экспоненциальное число с плавающей точкой;
- %s: форматирует аргумент как String;
- %c: форматирует аргумент как символ;
- %b: форматирует аргумент как Boolean. Значение "true" выводится, если аргумент истинен, и значение "false" выводится, если аргумент ложен.
- %n: печатает перенос строки, принятый в текущей операционной системе;
- %%: печатает сам знак процента.
System.out.printf("Скидка %d%%%n", 15); // Скидка 15%
System.out.printf("Первая строка%n");
System.out.printf("Вторая строка%n");
Вместо %n можно писать и \n: разница в том, что \n это всегда один символ перевода строки, а %n подставляет разделитель строк текущей системы (в Windows это пара символов).Понимание форматирования
Форматирование является важнейшим аспектом любого языка программирования, поскольку оно определяет, как данные представляются пользователям. С методом Java printf форматирование становится проще и более гибким. Вы можете контролировать ширину полей, указывать количество десятичных знаков для чисел с плавающей точкой и выравнивать текст в соответствии с вашими требованиями.Использование метода Java Printf
Рассмотрим несколько примеров. В первом мы собираемся отформатировать десятичное число пи.public class PrintfExample1 {
public static void main(String[] args) {
double pi = 3.141592;
int precision = 3;
//пример printf
System.out.printf("Значение пи с %d десятичными знаками: %.3f", precision, pi);
}
}
Вывод этой программы:
System.out.printf(Locale.US, "Значение пи: %.3f%n", pi); // Значение пи: 3.142
Дальше в статье все выводы показаны для русской локали.
Теперь рассмотрим другой пример Java printf, в котором мы выводим отформатированные строки и целые числа:
public class PrintfExample2 {
public static void main(String[] args) {
String name = "Алиса";
int age = 15;
//пример printf
System.out.printf("Привет, меня зовут %s, и мне %d лет.", name, age);
}
}
Вывод программы:
public class PrintfExample {
public static void main(String[] args) {
String name = "Иван";
int age = 30;
double salary = 50000.50;
//пример printf
System.out.printf("Имя: %s, Возраст: %d, Зарплата: %.2f", name, age, salary);
}
}
Вывод:
public class PrintfExample3 {
public static void main(String[] args) {
boolean isJavaFun = true;
//пример printf
System.out.printf("Java интересна? %b", isJavaFun);
}
}
Вывод:
Продвинутые техники форматирования
Научная нотация необходима при работе с очень большими или очень малыми числами. Метод printf поддерживает научную нотацию, используя спецификаторы формата %e или %E.
Пример: научная нотация
public class ScientificNotationExample {
public static void main(String[] args) {
double largeNumber = 123456789.12345;
double smallNumber = 0.000012345;
System.out.printf("Большое число в научной нотации: %e\n", largeNumber);
System.out.printf("Малое число в научной нотации: %E\n", smallNumber);
}
}Вывод:
Здесь спецификаторы %e и %E представляют числа в научной нотации, где e или E указывает степень 10.
Обработка FormatFlagsConversionMismatchException
При использовании printf несовпадающие флаги формата и типы преобразования могут привести к FormatFlagsConversionMismatchException. Это исключение возникает, когда используется неподдерживаемая комбинация флагов и спецификаторов, например, использование '+' с %s (строкой).
Пример: несовместимый флаг
import java.util.FormatFlagsConversionMismatchException;
public class FormatExceptionExample {
public static void main(String[] args) {
try {
System.out.printf("Неверный формат: %+s\n", "текст");
} catch (FormatFlagsConversionMismatchException e) {
System.out.println("Исключение поймано: " + e.getMessage());
}
}
}Вывод:
Чтобы избежать этого исключения, убедитесь, что флаги и спецификаторы формата совместимы. Обратитесь к документации Java для получения информации о разрешенных комбинациях.
Использование ширины, точности и флагов формата в продвинутом форматировании
Метод printf предоставляет опции для контроля ширины, точности и выравнивания отформатированных выводов, что делает его идеальным для создания структурированных таблиц или визуально привлекательных выводов.
1. Контроль ширины
Спецификатор ширины обеспечивает, что вывод занимает фиксированное количество символов. Если значение короче указанной ширины, оно дополняется пробелами.
System.out.printf("|%10s|\n", "Java"); // Выравнивание по правому краю
System.out.printf("|%-10s|\n", "Java"); // Выравнивание по левому краюВывод:
2. Контроль точности
Точность используется для контроля количества десятичных знаков для значений с плавающей точкой или максимальной длины символов для строк.
System.out.printf("%.2f\n", 123.4567); // Ограничивает до 2 десятичных знаков
System.out.printf("%.5s\n", "JavaProgramming"); // Ограничивает до 5 символовВывод:
3. Комбинирование ширины и точности
Вы можете комбинировать ширину и точность для более сложного форматирования. Например:
System.out.printf("|%10.2f|\n", 123.4567); // Выравнивание по правому краю с 2 десятичными знаками
System.out.printf("|%-10.2f|\n", 123.4567); // Выравнивание по левому краю с 2 десятичными знакамиВывод:
Преимущества использования Printf
Метод Java printf() предлагает несколько преимуществ, включая:- Улучшенный контроль над форматированием текста.
- Упрощенное выравнивание и точность для числовых значений.
- Повышенная читаемость кода, особенно для сложного форматирования.
- Последовательное форматирование в различных операторах вывода.
Шпаргалка: спецификаторы, ширина и флаги
Соберем все разобранное в одну таблицу:| Запись | Что делает | Пример вызова | Вывод |
|---|---|---|---|
| %s | подставляет строку (для любого объекта вызовет toString()) | printf("%s", "Мир") | Мир |
| %d | целое число | printf("%d", 42) | 42 |
| %f | дробное число, по умолчанию 6 знаков после запятой | printf("%f", 3.14) | 3,140000 |
| %.2f | дробное число с заданной точностью | printf("%.2f", 3.14159) | 3,14 |
| %e и %E | научная нотация, строчная и прописная | printf("%e", 123456789.0) | 1,234568e+08 |
| %c | один символ | printf("%c", 'A') | A |
| %b | логическое значение | printf("%b", true) | true |
| %10s | ширина поля: дополняет пробелами слева | printf("|%10s|", "Java") | | Java| |
| %-10s | ширина поля с выравниванием по левому краю | printf("|%-10s|", "Java") | |Java | |
| %,d | группировка разрядов по правилам локали | printf(Locale.US, "%,d", 1000000) | 1,000,000 |
| %n | перенос строки, зависящий от операционной системы | printf("строка%n") | перевод строки |
| %% | печатает сам знак процента | printf("100%%") | 100% |