1. Проблема ручной конкатенации
Если нужно вывести одну-две переменные, оператор + действительно удобен. Но когда данных много, конкатенация быстро превращается в хаос, особенно если требуется форматирование чисел (например, 2 знака после запятой) или переносы строк.
String name = "Олег";
int age = 25;
double balance = 12345.67;
System.out.println("Имя: " + name + ", возраст: " + age + ", баланс: " + balance + " евро.");
Попытка «докрутить» форматирование внутри конкатенации только ухудшает читаемость:
System.out.println("Имя: " + name + ", возраст: " + age + ", баланс: " + String.format("%.2f", balance) + " евро.");
Вывод: простая конкатенация хороша для мелочей, но для сложных сообщений нужен более мощный инструмент — String.format().
2. String.format — форматируем строки по-взрослому
Метод String.format() позволяет создавать строку по шаблону и подставлять значения в заданные позиции.
Общий вид:
String result = String.format("Шаблон", значения);
- %s — строка
- %d — целое число
- %f — число с плавающей точкой
- %n — перенос строки (кроссплатформенно)
String name = "Олег";
int age = 25;
double balance = 12345.6789;
String info = String.format("Имя: %s, возраст: %d, баланс: %.2f евро.", name, age, balance);
System.out.println(info);
// Выведет: Имя: Олег, возраст: 25, баланс: 12345.68 евро.
String result = String.format("Имя: %s, возраст: %d, баланс: %.2f евро", name, age, balance);
// %s — строка, %d — целое, %.2f — число с 2 знаками после запятой
Форматирование чисел и строк
Дробные числа с фиксированной точностью:
double price = 99.999;
System.out.println(String.format("Цена: %.2f евро.", price)); // Цена: 100.00 евро.
Ширина поля и выравнивание:
int n = 7;
System.out.println(String.format("Число: [%5d]", n)); // Число: [ 7]
System.out.println(String.format("Число: [%-5d]", n)); // Число: [7 ]
[5d] — ширина поля 5, выравнивание по правому краю по умолчанию;
[-5d] — ширина поля 5, выравнивание влево.
Строки с выравниванием:
String text = "Java";
System.out.println(String.format("[%10s]", text)); // [ Java]
System.out.println(String.format("[%-10s]", text)); // [Java ]
Проценты:
double percent = 0.125;
System.out.println(String.format("Готово: %.1f%%", percent * 100)); // Готово: 12.5%
Чтобы вывести символ процента, используйте %%.
Форматирование дат (кратко)
import java.util.Date;
Date now = new Date();
System.out.println(String.format("Сегодня: %tD", now)); // Сегодня: 06/18/24
System.out.println(String.format("Время: %tT", now)); // Время: 15:42:07
Локализация и разделители
По умолчанию используется локаль системы. Чтобы задать свою (например, запятая как разделитель дробной части), передайте локаль — например, Locale.FRANCE.
import java.util.Locale;
double price = 1234.56;
System.out.println(String.format(Locale.FRANCE, "%.2f", price)); // 1234,56
Практические примеры
Пример 1: Короткий отчёт
String name = "Анна";
int tasks = 5;
double hours = 12.3456;
String report = String.format(
"Сотрудник: %s%nВыполнено задач: %d%nПотрачено часов: %.1f",
name, tasks, hours
);
System.out.println(report);
/* Вывод:
Сотрудник: Анна
Выполнено задач: 5
Потрачено часов: 12.3
*/
Пример 2: Таблица с выравниванием
String header = String.format("%-10s | %5s | %8s", "Имя", "Баллы", "Время");
String row1 = String.format("%-10s | %5d | %8.2f", "Олег", 95, 10.5);
String row2 = String.format("%-10s | %5d | %8.2f", "Анна", 100, 9.75);
System.out.println(header);
System.out.println(row1);
System.out.println(row2);
/* Вывод:
Имя | Баллы | Время
Олег | 95 | 10.50
Анна | 100 | 9.75
*/
Пример 3: Смешанный текст
int apples = 12;
int pears = 8;
System.out.println(String.format("У меня %d яблок и %d груш.", apples, pears));
3. Практика: форматирование строк в нашем приложении
Добавим форматирование в консольное приложение: баланс всегда с двумя знаками после запятой, переносы — через %n.
Scanner console = new Scanner(System.in);
System.out.print("Введите имя: ");
String name = console.nextLine();
System.out.print("Введите возраст: ");
int age = console.nextInt();
System.out.print("Введите баланс: ");
double balance = console.nextDouble();
// Форматированный вывод
String info = String.format("Имя: %s, возраст: %d, баланс: %.2f евро.", name, age, balance);
System.out.println(info);
Попробуйте:
- Вводить разные значения и проверить, что баланс всегда выводится с двумя знаками после запятой (%.2f).
- Изменить шаблон, чтобы добавить переносы строк с помощью %n.
4. Типичные ошибки при форматировании строк
Ошибка № 1: Несоответствие типов и маркеров.
Нельзя подставлять строку в %d или число в %s.
String.format("Возраст: %d", "двадцать"); // Ошибка: ожидалось число, передана строка
Ошибка № 2: Перепутали порядок аргументов.
Шаблон %s %d, а передали сначала число, затем строку — получите ошибку или неверный вывод.
Ошибка № 3: Игнорирование локали.
Ожидали запятую как разделитель дробной части, а видите точку — задайте нужную локаль явно через первый параметр String.format(...).
Ошибка № 4: Неэкранированный символ процента.
Чтобы вывести символ %, используйте %%, иначе форматирование упадёт с ошибкой.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ