JavaRush /Курсы /JAVA 25 SELF /Форматирование строк

Форматирование строк

JAVA 25 SELF
9 уровень , 2 лекция
Открыта

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: Неэкранированный символ процента.
Чтобы вывести символ %, используйте %%, иначе форматирование упадёт с ошибкой.

1
Задача
JAVA 25 SELF, 9 уровень, 2 лекция
Недоступна
Форматированный вывод имени и возраста
Форматированный вывод имени и возраста
1
Задача
JAVA 25 SELF, 9 уровень, 2 лекция
Недоступна
Форматирование числа с плавающей точкой
Форматирование числа с плавающей точкой
1
Задача
JAVA 25 SELF, 9 уровень, 2 лекция
Недоступна
Форматирование таблицы с выравниванием
Форматирование таблицы с выравниванием
1
Задача
JAVA 25 SELF, 9 уровень, 2 лекция
Недоступна
Форматирование отчёта с процентом и локалью
Форматирование отчёта с процентом и локалью
Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Kidze Уровень 21
21 октября 2025
Когда я ставлю точку в конце, оказывается она не нужна, когда не ставлю нужна=)
Anonymous #3668556 Уровень 9
23 октября 2025
надо точку поставить на английской раскладке и тогда проходит )
12 октября 2025
"Ошибка № 1: Несоответствие типов и маркеров. Нельзя подставлять строку в %d или число в %s." Не ясно почему нельзя подставлять число в %s, такая возможность имеется, а вот строку в %d не добавишь, это да
Александр Уровень 50
4 октября 2025
Для вещественных чисел инструкция .1 возвращает округленное до одного знака значение. То есть, имеем не просто форматирование, а форматирование с округлением. К тому же форматирование умное. Если значение слишком "толстое", то оно все равно выводится на экран полностью, без потерь знаков. Это же касается и строк

System.out.println(String.format("%2d", 9999));
// Вывод: 9999

System.out.println(String.format("%2.1f", -10000.49);
// Вывод: -10000.5
Big198801 Уровень 28
16 сентября 2025
👍.equals("\" + "uD83D" + "\" + "uDC4D");