Rukovodstvo
статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
Как отформатировать строку в Java с примерами
Введение В Java существует несколько способов форматирования строк. Некоторые из них являются олдскульными и заимствованы непосредственно из старой классики (например, printf из C), в то время как другие больше в духе объектно-ориентированного программирования, например, класс MessageFormat. В этой статье мы рассмотрим несколько из этих подходов. Мы покажем некоторые особенности того, как можно использовать каждый из методов и в каких обстоятельствах. Используя эти знания, вы узнаете, как подойти к форматированию строк и какие
Время чтения: 11 мин.
Вступление
В Java существует несколько способов форматирования строк. Некоторые из них являются олдскульными и заимствованы непосредственно из старой классики (например, printf из C), в то время как другие больше в духе объектно-ориентированного программирования, например, класс MessageFormat
В этой статье мы рассмотрим несколько из этих подходов. Мы покажем некоторые особенности того, как можно использовать каждый из методов и в каких обстоятельствах. Используя эти знания, вы узнаете, как подойти к форматированию строк и какие методы использовать.
System.out.printf ()
Начнем со старой классики printf() . Как упоминалось ранее, printf() происходит от языка программирования C и означает форматирование для печати. Под капотом printf() использует java.util.Formatter , о котором мы поговорим позже.
Принцип работы printf() можно объяснить ее аргументами. Наиболее распространенный способ использования printf() следующий:
Мы видим, что метод ожидает format и arguments vararg. format определяет способ форматирования строки — шаблон для окончательного результата.
Например, вы можете захотеть напечатать десятичное число с семью десятичными знаками или число в шестнадцатеричном представлении. Или у вас может быть предопределенное сообщение для приветствия пользователей, но вы хотите отформатировать его, чтобы включить имя пользователя.
arguments vararg обычно ожидают аргументы (т. Е. Значения) для строки шаблона. Например, если в шаблоне есть заполнители для двух чисел, метод printf() также будет ожидать два числа в качестве arguments :
Мы поместили два %d в строку шаблона. Эти два символа представляют собой заполнители для определенного типа значения. Например, %d — это десятичное числовое значение. Поскольку у нас их два, мы должны передать два аргумента, которые соответствуют числовым значениям, например 42 и 23 .
Запуск этого кода даст:
Спецификаторы формата
С помощью printf() вы можете печатать такие значения, как числа, строки, даты и т. Д. Чтобы метод знал, что именно вы пытаетесь напечатать, вам необходимо предоставить спецификатор формата для каждого из значений. Давайте посмотрим на пример:
При выполнении этот код напечатает Hello, reader в консоль. Символ %s представляет описатель формата для строк, аналогично тому, как %d представляет описатель формата для десятичных чисел.
Мы можем использовать множество спецификаторов формата. Вот несколько распространенных:
- % c — символ
- % d — десятичное число (основание 10)
- % e — экспоненциальное число с плавающей запятой
- % f — число с плавающей запятой
- % i — целое число (основание 10)
- % o — восьмеричное число (основание 8)
- % s — Строка
- % u — беззнаковое десятичное (целое) число
- % x — шестнадцатеричное число (основание 16)
- % t — Дата / время
- % n — Новая строка
Если мы хотим напечатать, например, символ и восьмеричное число, мы должны использовать %c и %o соответственно. Вы можете заметить кое-что необычное: спецификатор новой строки. Если вы не привыкли к printf() из C, может показаться немного странным указывать такие вещи.
Ну, printf() по умолчанию не записывает новую строку. Фактически, по умолчанию он почти ничего не делает. По сути, если вы хотите, чтобы что-то произошло, вы должны сделать это сами.
То есть — если у нас есть несколько printf() без спецификатора новой строки:
Хотя, если мы включим символ новой строки:
Тогда результат будет:
Примечание. %n — это специальный формат, который может быть либо \r\n либо просто \n . \n — это фактический символ новой строки, а \r — это символ возврата каретки. Обычно рекомендуется использовать \n поскольку он работает должным образом во всех системах, в отличие от %n который можно понимать как любой из двух. Подробнее об этом позже.
Персонажи побега
В дополнение к описанным выше описателям формата существует еще один тип символов форматирования: escape-символы.
Давайте представим , что мы хотим напечатать " символ с помощью printf() Мы можем попробовать что — то вроде.:
Если вы попытаетесь запустить это, ваш компилятор наверняка выдаст исключение. Если вы присмотритесь, даже код, который выделяет код на этой странице, будет выделен ); как String, а не закрытая скобка метода.
Случилось так, что мы попытались напечатать символ, имеющий особое, зарезервированное значение. Кавычки используются для обозначения начала и конца строки.
Мы начали и закончили строку "" , после чего мы открыли еще один " , но не закрыл его. Это делает печать зарезервированных символов , как это невозможно, используя этот подход.
Способ обойти это — убежать . Чтобы напрямую печатать специальные символы (такие как " ), нам нужно сначала избежать его эффектов, а в Java это означает префикс обратной косой черты ( \ ). Чтобы официально печатать кавычки в Java, мы должны сделать следующее:
Сочетание \ и " определенно говорит компилятору , что мы хотели бы, чтобы вставить " символ в том месте , и что он должен относиться к " в качестве значения конкретного, а не зарезервированный символ.
Применение escape-символа \ может вызывать различные эффекты в зависимости от последующего. Передача обычного символа (незарезервированного) ничего не даст, а \ будет рассматриваться как значение.
Однако некоторые комбинации (также называемые командами) имеют для компилятора другое значение:
- \ b — Вставить пробел
- \ f — Первый символ следующей строки начинается справа от последнего символа текущей строки
- \ n — вставить новую строку
- \ r — вставить возврат каретки
- \ t — Вставить вкладку
- \\ — Вставить обратную косую черту
- %% — вставить знак процента
Таким образом, вы должны использовать \n для вывода разделителя строк на консоль, эффективно начиная любое новое содержимое с начала следующей строки. Точно так же, чтобы добавить вкладки, вы должны использовать спецификатор \t
Вы могли заметить %% как последнюю комбинацию.
Почему это? Почему просто не используется \%
Символ % уже является escape-символом специально для метода printf() За которыми следуют такие символы, как d , i , f и т. Д., Средство форматирования во время выполнения знает, как обрабатывать эти значения.
Однако \ предназначен для компилятора. Он сообщает, куда и что вставлять. Команда \% просто не определена, и мы используем % чтобы избежать эффекта последующего % — если это имеет смысл.
Для компилятора % не является специальным символом, а является \ Кроме того, существует соглашение, согласно которому специальные символы избегают самих себя. \ экранирует \ и % экранирует % .
Основное использование
Давайте отформатируем строку с несколькими аргументами разных типов:
Поплавок и двойная точность
С помощью printf() мы можем определить настраиваемую точность для чисел с плавающей запятой:
Поскольку %f используется для чисел с плавающей запятой, мы можем использовать его для вывода double s. Однако, добавив .n , где n — количество десятичных знаков, мы можем определить настраиваемую точность.
Выполнение этого кода дает:
Форматирование заполнения
Мы также можем добавить отступы, включая переданную строку:
Здесь после % мы передали число и спецификатор формата. В частности, нам нужна строка из 10 символов, за которой следует новая строка. Поскольку stack содержит только 5 символов, еще 5 добавляются в качестве отступа, чтобы «заполнить» строку до целевого символа:
Вместо этого вы также можете добавить правый отступ:
Locale
Мы также можем передать Locale в качестве первого аргумента, форматируя строку в соответствии с ним:
Это даст два целых числа в разных форматах:
Индекс аргумента
Если индекс аргумента не указан, аргументы будут просто следовать порядку присутствия в вызове метода:
Однако после % и перед спецификатором формата мы можем добавить другую команду. $n укажет индекс аргумента:
Здесь 2$ находится между % и d . 2$ указывает, что мы хотим присоединить второй аргумент из списка аргументов к этому спецификатору. Точно так же 1$ указывает, что мы хотели бы присоединить первый аргумент из списка к другому спецификатору.
Выполнение этого кода приводит к:
Вы можете указать оба спецификатора на один и тот же аргумент. В нашем случае это будет означать, что мы используем только один аргумент, указанный в списке. Это прекрасно — хотя нам все равно нужно предоставить все аргументы, присутствующие в шаблоне String:
System.out.format ()
Прежде чем говорить о System.out.format() , давайте кратко остановимся на System.out .
Все системы UNIX имеют три основных канала — стандартный канал ввода ( stdin ), стандартный канал вывода ( stdout ) и стандартный канал ошибок ( stderr ). Поле out соответствует PrintStream stdout и имеет тип PrintStream.
Этот класс имеет много различных методов для печати форматированных текстовых представлений в поток, некоторые из которых — это format() и printf() .
Согласно документации, они оба ведут себя одинаково . Это означает, что между ними нет разницы, и их можно использовать для получения тех же результатов. Все, что мы до сих пор говорили о printf() также работает для format() .
И printf() и System.out.format() печатают в stdout , который обычно нацелен на консоль / терминал.
String.format ()
Другой способ форматирования строк — String.format() который внутренне также использует java.util.Formatter , который мы рассмотрим в следующем разделе.
Основное преимущество String.format() перед printf() — это его возвращаемый тип — он возвращает String . Вместо того, чтобы просто печатать содержимое в стандартном канале вывода и не иметь возвращаемого типа ( void ), как printf() , String.format() используется для форматирования строки, которую можно использовать или повторно использовать в будущем:
Теперь вы можете делать все , что вы хотели бы в formattedString . Вы можете распечатать его, вы можете сохранить его в файл, вы можете изменить его или сохранить в базе данных. Его печать приведет к:
Метод String.format() использует тот же базовый принцип, что и метод printf() . Оба внутренне используют Formatter для фактического форматирования строк. Таким образом, все, что сказано для printf() также применимо к String.format() .
Использование printf() , String.format() или Formatter по сути одно и то же. Единственное, что отличается, — это тип возвращаемого значения — printf() печатает в стандартный поток вывода (обычно в вашу консоль), а String.format() возвращает отформатированную String .
При этом String.format() более универсален, поскольку вы можете использовать результат более чем одним способом.
Класс Formatter
Поскольку все вышеперечисленные методы по своей сути вызывают Formatter , знание только одного означает, что вы знаете их все.
Использование Formatter очень похоже на другие методы, показанные ранее. Самая большая разница в том, что для его использования нужно создать экземпляр объекта Formatter
Почему бы мне всегда просто не использовать предыдущие методы, поскольку они более краткие?
Есть еще одно важное отличие, делающее Formatter достаточно гибким:
Вместо того, чтобы работать только с String s, Formatter также может работать с StringBuilder что позволяет (повторно) эффективно использовать оба класса.
Фактически, Formatter может работать с любым классом, реализующим интерфейс Appendable Одним из таких примеров является вышеупомянутый StringBuilder , но другие примеры включают такие классы, как BufferedWriter , FileWriter , PrintStream , PrintWriter , StringBuffer и т. Д. Полный список можно найти в документации .
Наконец, все спецификаторы формата, escape-символы и т. Д. Также действительны для Formatter поскольку это основная логика для форматирования строк во всех трех случаях: String.format() , printf() и Formatter .
MessageFormat
Наконец, давайте покажем еще один последний метод форматирования, который не использует Formatter под капотом.
MessageFormat был создан для создания и предоставления объединенных сообщений независящим от языка способом. Это означает, что форматирование будет одинаковым, независимо от того, используете ли вы Java, Python или какой-либо другой язык, поддерживающий MessageFormat .
MessageFormat расширяет абстрактный Format точно так же, как DateFormat и NumberFormat . Класс Format предназначен для форматирования объектов, зависящих от языкового стандарта, в строки.
Давайте посмотрим , хороший пример, любезно MessageFormat «s документации .
Вместо описателей процентов, которые мы видели до сих пор, здесь мы используем фигурные скобки для каждого аргумента. Возьмем первый аргумент, <1, time>. Число 1 представляет собой индекс аргумента, который следует использовать вместо него. В нашем случае аргументами являются planet , new Date() и event .
Вторая часть, time , относится к типу значения. Типы формата верхнего уровня — это number , date , time и choice . Для каждого из значений можно сделать более конкретный выбор, например, с помощью <0, number, integer>который говорит, что значение следует рассматривать не только как число, но и как целое число.
Полный набор типов и подтипов форматов можно найти в документации .
Заключение
В этой статье мы рассмотрели изрядное количество способов форматирования строк в ядре Java.
У каждой из представленных нами техник есть своя причина существования. printf() , например, напоминает одноименный метод C старой школы из.
Другие подходы, такие как Formatter или MessageFormat предлагают более современный подход, который использует некоторые преимущества объектно-ориентированного программирования.
У каждого метода есть свои варианты использования, поэтому, надеюсь, вы сможете знать, когда использовать каждый из них в будущем.
Форматируем вывод чисел в Java

Всем привет! Часто в наши методы приходят числа, которые нужно отобразить в каком-то особом формате. Вроде бы как мелочь, но как бы вы реализовали эту задачу? Предлагаем над этим сегодня немного поразмыслить. Для начала, чтобы с головой окунуться в форматирование чисел в Java, давайте вспомним метод format класса String : public static String format(String format, Object… args) — возвращает строку, отформатированную из строки format с помощью остальных аргументов args . И сразу пример: В итоге мы получим вывод в консоли:
Методы printf и format
| Тип форматируемого значения | Пример | |
|---|---|---|
| %s | Любой тип, который будет приведен к строке | Результат: |

.2 — не единственная поднастройка спецификаторов. Комбинация данных поднастроек называется инструкцией .Общий вид инструкции такой:
- [аргумент_индекс] — целое число, указывающее позицию в списке аргументов. К примеру, ссылка на первый аргумент 1$, ссылка на второй аргумент — 2$, и т.д. Если же позиция не была задана, аргументы должны находиться в том же порядке, что и ссылки на них в строке форматирования.
- [флаги] — специальные символы для форматирования. Например:
- + флаг, означающий, что если числовое значение положительное, оно должно включать знак +
- — означает выравнивание результата по левому краю
- , устанавливает разделитель тысяч у целых чисел
DecimalFormat
- # — цифра, ведущие нули опускаются;
- 0 — цифра отображается всегда, даже если в номере меньше цифр (в таком случае отображается 0);
- . — знак десятичного разделителя;
- , — знак группировки разделителей (например, разделитель тысяч);
- ; — разделяет форматы;
- — — отмечает префикс отрицательного числа;
- % — умножает на 100 и показывает число в процентах;
- ? — умножает на 1000 и показывает число в промилле;
- E — разделяет мантиссу и порядок для экспоненциального формата.

Не обязательно создавать каждый раз новый объект DecimalFormat , чтобы задать новый шаблон. Будет достаточно использовать его методы applyPattern и applyLocalizedPattern : Когда мы говорим о форматировании числа с плавающей запятой, нас немало интересует округление, не так ли? Так вот, при обрезании числа со знаками после запятой, выходящими за заданный шаблон, DecimalFormat округляет число в большую сторону, если последнее обрезаемое число больше 5. А если последнее обрезаемое — 5? Ведь в таком случае это число ровно посередине между ближайшими целыми.В этом случае в расчет берется предыдущее до него число. Если предыдущее число чётное, округление производится: Вывод в консоли:
BigDecimal и BigInteger
Форматирование Date и Time

Выше только упоминалось, что с помощью format() класса String можно еще и форматировать время и дату.Что же, давайте взглянем, как это делается. Во-первых, хотелось бы напомнить, что для дат используется спецификатор формата %t . Во-вторых, при форматировании шаблона, для каждого спецификатора формата для дат требуются дополнительные флаги форматирования. Вот возможные флаги форматирования для дат:
Флаги Описание %tB Полное название месяца, например, January, February и т.д. %tb Сокращенное название месяца, например, Jan, Feb и т.д. %tA Полное название дня недели, например, Sunday, Monday %ta Сокращенное название дня недели, например, Sun, Mon и т.д. %tY Год в формате 4 цифры, например, от 0000 до 9999 %ty Год в формате 2 цифры, например, от 00 до 99 %tm Месяц отформатирован с нуля в начале, например, от 01 до 12 %tc Дата и время в формате %ta %tb %td %tT %tZ %tY, например, Mon Feb 17 03:56:12 PST 2020 %tD Дата в формате %tm/%td/%ty %td День месяца в формате двух цифр, например, от 01 до 31 %te День месяца в формате без 0 в начале, например от 1 до 31 %tT Время в 24-часовом формате, например, %tH:%tM:%tS %tH Час дня в 24-часовом формате, от 00 до 23 %tI Час дня для 12-часового формата, например, от 01 до 12 %tM Минуты в часе форматируются с нуля в начале, например, от 00 до 59 %tS Секунды в минуте, состоящие из двух цифр, например, от 00 до 59 %tZ Аббревиатура часового пояса, например, PST, UTC и т.д. Пример 1
Пример 2

Столько раз передавать аргументом один и тот же объект Date. Как-то выглядит не очень, не так ли? Давайте воспользуемся внутренней поднастройкой $ для указания аргумента, который мы хотим использовать: Вывод в консоли у нас и не изменится. Есть и другие не менее интересные способы форматирования даты. О них и немного подробнее о времени и дате в Java можно почитать вот в этом материале. На этом у меня на сегодня всё, спасибо за внимание!
Formatting Output with printf() in Java
Navigating the complexities of Spring can be difficult, even for seasoned developers.
If you need direct, practical help and guidance with your own Spring work, Trifork’s CTO, Joris Kuipers, is running a closed-door call.
It’s free, but it’s limited to only 3 seats, so if you need it, I would join quickly and be sure to attend:
With more than 15 years of leading custom software development projects involving Spring, Joris has gained a lot of real-world experience, and this call is about sharing and helping the community.
Building or modernizing a Java enterprise web app has always been a long process, historically. Not even remotely quick.
That’s the main goal of Jmix is to make the process quick without losing flexibility — with the open-source RAD platform enabling fast development of business applications.
Critically, it has very minimal impact on your server’s performance, with most of the profiling work done separately — so it needs no server changes, agents or separate services.
Simply put, a single Java or Kotlin developer can now quickly implement an entire modular feature, from DB schema, data model, fine-grained access control, business logic, BPM, all the way to the UI.
Jmix supports both developer experiences – visual tools and coding, and a host of super useful plugins as well:
Slow MySQL query performance is all too common. Of course it is. A good way to go is, naturally, a dedicated profiler that actually understands the ins and outs of MySQL.
The Jet Profiler was built for MySQL only, so it can do things like real-time query performance, focus on most used tables or most frequent queries, quickly identify performance issues and basically help you optimize your queries.
Critically, it has very minimal impact on your server’s performance, with most of the profiling work done separately — so it needs no server changes, agents or separate services.
Basically, you install the desktop application, connect to your MySQL server, hit the record button, and you’ll have results within minutes:
The Kubernetes ecosystem is huge and quite complex, so it’s easy to forget about costs when trying out all of the exciting tools.
To avoid overspending on your Kubernetes cluster, definitely have a look at the free K8s cost monitoring tool from the automation platform CAST AI. You can view your costs in real time, allocate them, calculate burn rates for projects, spot anomalies or spikes, and get insightful reports you can share with your team.
Connect your cluster and start monitoring your K8s costs right away:
Java printf() — Print Formatted String to Console

While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.
We’ve already discussed Java println() method in a previous tutorial. Today, we’ll discuss the printf() method and its various implementations in detail. Ready. Get. Set. Go!
Java printf()
- printf() method is not only there in C, but also in Java.
- This method belongs to the PrintStream class.
- It’s used to print formatted strings using various format specifiers.
Syntax
Following are the syntaxes available for the printf() method:
The first one does not do any formatting though and it’s like the println() method.
System.out.format() is same as System.out.printf() method.
Difference between String.format() and System.out.printf()
- String.format() returns a formatted string. System.out.printf() also prints a formatted string to the console.
- printf() uses the java.util.Formatter class to parse the format string and generate the output.
Format Specifiers
Let’s look at the available format specifiers available for printf :
- %c character
- %d decimal (integer) number (base 10)
- %e exponential floating-point number
- %f floating-point number
- %i integer (base 10)
- %o octal number (base 8)
- %s String
- %u unsigned decimal (integer) number
- %x number in hexadecimal (base 16)
- %t formats date/time
- %% print a percent sign
- \% print a percent sign
Note: %n or \n are used as line separators in printf() .
Escape Characters
Following are the escape characters available in printf() :
- \b backspace
- \f next line first character starts to the right of current line last character
- \n newline
- \r carriage return
- \t tab
- \\ backslash
Format Specifiers Full Syntax
Let’s look at the full syntax of format specifiers with the extended set:
flags can be set as + for right-aligning, and — for left-aligning. Next, fire up your Jshell and start using printf() !
Number Formatting
Here’s an example:
Let’s use some precision formatting:
As you can see it rounds off to the next decimal in the second case.
Width Specifier, Aligning, Fill With Zeros
In this section, we’ll see three examples for each of these:
As you can see the width specifier allocates 5 characters width. The content is right aligned by default. Filling with zeros Empty spaces to the left of the first character can be filled with zeroes as shown below:
Aligning By default, it is a + which means right aligned.
The following code, aligns to the left:
Using Comma and Locale:
String, Boolean formatting
Let’s look at String formatting with a few basic examples:
Boolean formatting examples are given below:
Time Formatting
‘H’, ‘M’, ‘S’ — Hours, Minutes, Seconds ‘L’, ‘N’ – to represent the time in milliseconds and nanoseconds accordingly ‘p’ – AM/PM ‘z’ – prints out the difference from GMT.
The latter one requires many arguments which are the same. Instead, we can replace them with a single one:
Date Formatting
Date formatting has the following special characters A/a — Full day/Abbreviated day B/b — Full month/Abbreviated month d — formats a two-digit day of the month m — formats a two-digit month Y — Full year/Last two digits of the Year j — Day of the year
Conclusion
In this tutorial, we discussed the various types of formatting possible using printf() method.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.