Сегодня мы разберемся с форматированием текстовых и числовых выражений в Java, поработаем с Java String format()
, узнаем что такое спецификаторы, какие они бывают и как ими пользоваться.
Содержание
Основное средство управления выводимой на экран информации в Java — класс Formatter
. Последний добавлен в состав пакета java.util, где также содержится множество вспомогательных классов и интерфейсов.
Этот класс дает возможность преобразовывать формат данных — числа, строки, дату, время, а также отображать их на экране в указанном оформлении.
Класс Formatter
содержит метод format()
. Данный метод получает данные и затем их преобразует в определенный строковый формат, сохраняя их в объект типа Formatter. Метод format()
также имеется в классах PrintStream
и PrintWriter
(System.out
— статическая переменная типа PrintStream
).
Для оформления вывода используются так называемые спецификаторы формата. В выражении впереди стоит знак %
после которого идет символ, указывающий на тип аргумента, который нужно отформатировать.
Чтобы понять, для чего нужен этот инструмент, представьте себе задачу, когда необходимо вывести на экран некоторую информацию. Допустим:
public static void main(String[] args) { String student_surname = "Alex Petrov"; int age = 19; String teacher = "Serge Bond"; int hours = 301; System.out.println("User = {surname: " + student_surname + ", age: " + age + " let, teacher: " + teacher + ", duration_of_the_training: " + hours + " hours.}"); } }
На экране наблюдаем:
User = {surname: Alex Petrov, age: 19 let, teacher: Serge Bond, duration_of_the_training: 301 hours.}
Визуально ситуация еще более затрудняется, когда переменные содержат слишком «неудобные» имена с большим количеством символов, а также когда необходимо использовать методы для вызова тех или иных данных:
System.out.println("User = {student_surname: " + user.getStudent_surname() + ", age: " + user.getAge() + " let, teacher: " + user.getTeachers().get(0) + ", duration_of_the_training: " + user.getExtraInformation().getDuration_of_the_training() + " hours.}");
Для решения проблемы поступаем следующим образом:
String information= String.format("User = {student_surname: %s, age: %d let, teacher: %s, duration_of_the_training: %d hours.}", user.getStudent_surname(), user.getAge(), user.getTeachers().get(0), user.getExtraInformation().getDuration_of_the_training()) System.out.println(information);
Мы передали в метод формат шаблон, где указали области, куда будем подставлять значения, обозначив их как %s
(когда подставляем строку) и %d
(когда подставляем число).
Еще более наглядный пример:
String s = String.format("a = %d, b = %d, c = %d", 9, 77, 80); System.out.println(s);
В консоли будет выведен текст:
a = 9, b = 77, c = 80
Шаблонные строки можно использовать и при создании условий:
int a = -1, b = 4, c = 3; String shablon_dlya_texta; if (a < 0) shablon_dlya_texta = "Warning! a = %d, b = %d, c = %d"; else shablon_dlya_texta = "a = %d, b = %d, c = %d"; System.out.println(String.format(shablon_dlya_texta, a, b, c) );
Вывод на экран:
Warning! a = -1, b = 4, c = 3
Если применить в коде спецификаторы я верхним регистром — отображение в консоли также будет использовать верхний регистр. Например, %s
переведет соответствующую строку к верхнему регистру.
Средство форматирования класса Formatter поддерживает распространенные типы Java, такие как byte, BigDecimal и Calendar.
public static void main(String[] args) { double y = 775.0 / 33.0; System.out.println("Sample string without format: " + y); Formatter formatter = new Formatter(); formatter.format("Sample format string: %.2f%n", y); formatter.format("Sample format string: %8.4f%n", y); formatter.format("Sample format string: %16.4f%n", y); System.out.println(formatter); } }
На экране мы увидим следующее:
Sample string without format: 23.484848484848484
Sample format string: 23,48
Sample format string: 23,4848
Sample format string: 23,4848
Альтернативой методу для оформления вывода данных могут служить методы System.out.printf()
и System.out.format()
.
Примеры их использования:
System.out.printf("Hello - %s! So how's it going %s?", "Jack", "with the sales");
или
System.out.format("Hello - %s! So how's it going %s?", "Jack", "with the sales");
Рассмотрим наиболее часто употребляемые спецификаторы в таблице.
Спецификаторы | Тип данных | Пример использования /Результат |
%s | Строковый тип | String.format("Приветствую %s!","Олег")
|
%b | Все типы, приведенные к boolean. Значение «истинно» если не 0, «ложь» если 0 | String.format("Приветствую %b!",null)
|
%c | Cимвол Unicode | String.format("Любимый д%cм!",о')
|
%d | Целое число integer (включая byte, short, int, long, bigint) | String.format("С Новым %d годом! ",2025)
|
%e | Значения с плавающей запятой, научная нотация | String.format("Константа Фейгенбаума - %e!", 2.502);
|
%f | Обычное десятичное число | String.format("Число G равно - %f!", 9.8)
|
%a | Числа с плавающей строкой в шестнадцатеричном виде | String.format("Ускорение равно - %a!", 9.8);
|
%o | Целое число (int. byte, short, int, long, BigInteger) в восьмеричном формате | String str = String.format("Возраст ограничения - %o",18);
|
%n | Идентичен символу перевода строки /n | String.format(" Duran %n Duran")
|
%x | Целому числу (int. byte, short, BigInteger, int, long), соответствует символ с определенным значением в таблице ASCII | String.format("The upper limit is %x!",25)
|
%t | Управление преобразованием даты и времени с помощью флага | String.format("The current date is: %tA",new Date())
|
Вносить коррективы в форматирование можно также задействуя комбинации спецификаторов, которые называются инструкциями.
Формат записи инструкций выглядит следующим образом:
%[аргумент_индекс][флаги][ширина][.точность]спецификатор
-
— центрирование относительно левого края;#
— изменение отображения (например, перевод в восьмеричный формат);0
— пробелы в числовом значении заполняются нулями;«пробел»
— перед положительными числами появляется «пропуск»;+
— перед числами больше нуля идет знак «плюс»;,
— числа содержат знаки-разделители;(
— числа меньше нуля помещаются в скобки. Выравнивание относительно левого края:
System.out.println(String.format("|%-40s|", "Highload Today"));
Результат:
|Highload Today |
С выведением перед положительными числами символа +
:
System.out.println(String.format("|%+44d|", 701));
Отображение в консоли:
| +701|
С заданием ширины поля и максимальным числом символов:
System.out.println(String.format("|%25.8s|", "Highload Today"));
Отображение в консоли:
| Highload|
Пробел перед положительным числом:
System.out.println(String.format("|% d|", 877));
Результат:
| 877|
Вывод даты (не забываем предварительно импортировать import java.util.Locale;
):
Date date = new Date(); System.out.printf(Locale.ENGLISH,"%tB %te, %tY",date,date,date);
Вывод:
November 27, 2022
Теперь вы имеете представление о том, как работает форматирование в Java и можете применять спецификаторы и флаги, оформляя текст и числовые выражения.
Для закрепления материала рекомендуем вам посмотреть видеоурок, в котором рассказывается об основных приемах форматирования в Java:
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…
Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…