Рубріки: Теория

Java String format: работа с ним и примеры

Сергій Бондаренко

Сегодня мы разберемся с форматированием текстовых и числовых выражений в Java, поработаем с Java String format(), узнаем что такое спецификаторы, какие они бывают и как ими пользоваться.

Класс Formatter и метод 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)

Приветствую, false!

%c Cимвол Unicode
String.format("Любимый д%cм!",о')

Любимый дом!

%d Целое число integer (включая byte, short, int, long, bigint)
String.format("С Новым %d годом! ",2025)

С Новым 2025 годом!

%e Значения с плавающей запятой, научная нотация
String.format("Константа Фейгенбаума -  %e!",  2.502);

Константа Фейгенбаума - 2,502000e+00!

%f Обычное десятичное число
String.format("Число G равно -  %f!", 9.8)

Число G равно - 9.8!

%a Числа с плавающей строкой в шестнадцатеричном виде
String.format("Ускорение равно -  %a!", 9.8);

Ускорение равно - 0x1.399999999999ap3!

%o Целое число (int. byte, short, int, long, BigInteger) в восьмеричном формате
String str = String.format("Возраст ограничения - %o",18);

Возраст ограничения - 22

%n Идентичен символу перевода строки /n
String.format(" Duran %n Duran")

Duran

Duran

%x Целому числу (int. byte, short, BigInteger, int, long), соответствует символ с определенным значением в таблице ASCII
String.format("The upper limit is %x!",25)

The upper limit is 19!

%t Управление преобразованием даты и времени с помощью флага
String.format("The current date is: %tA",new Date())

The current date is Sunday

Вносить коррективы в форматирование можно также задействуя комбинации спецификаторов, которые называются инструкциями.

Формат записи инструкций выглядит следующим образом:

%[аргумент_индекс][флаги][ширина][.точность]спецификатор

Используемые флаги формата

  • - — центрирование относительно левого края;
  • # — изменение отображения (например, перевод в восьмеричный формат);
  • 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: 

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023