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 с символами, мы используем примитивный тип данных char.
Пример 1
Тем не менее, в разработке, мы встречаем ситуаций, где нам нужно использовать объекты вместо примитивных типов данных. Чтобы добиться этого, Java предоставляет класс-оболочку символов для примитивных данных типа char.
В Java класс символов предлагает ряд полезных (например, static) методов для манипулирования символами. Объект символа создается с помощью символьного конструктора (Character):
Java-компилятор также создаст объект символа для Вас в некоторых обстоятельствах. Например, если примитивный тип данных char передается в метод, ожидающий объект, компилятор автоматически преобразует для Вас char в объект Character. Эта функция называется автоматическая упаковка или распаковка, если преобразование идет другим путем.
Пример 2
Управляющие последовательности
В программирование на Java символ, которому предшествует знак обратной косой черты (\), называется управляющей последовательностью и имеет особое значение для компилятора.
Символ перехода на новую строку (\n) часто используется в наших примерах в System.out.println(), оператор переносит на следующую строку после напечатанной строки.
В приведенной ниже таблице показаны управляющие последовательности, используемые в Java:
| Управляющая последовательность | Описание |
| \t | Символ табуляции. |
| \b | Символ возврата в тексте на один шаг назад или удаление одного символа в строке (backspace). |
| \n | Символ перехода на новую строку. |
| \r | Символ возврата каретки. |
| \f | Прогон страницы. |
| \’ | Символ одинарной кавычки. |
| \» | Символ двойной кавычки. |
| \\ | Символ обратной косой черты (\). |
Когда управляющая последовательность встречает оператор print, java-компилятор интерпретирует это соответственно.
Пример управляющих последовательностей
Получим следующий результат:
Пример вставки символа двойных кавычек в строку
Чтобы вставить символ двойных кавычек в строку используйте управляющую последовательность \». Если Вы хотите взять в кавычки слово или словосочетание — вставьте \» 2 раза, одну в начале, другую в конце:
Типы данных char и String: примеры применения — введение в Java 004 #

Если в программе нужны символы, то для этого мы пользуемся типом данных char. Например:
Объект базового (примитивного) типа char является 16-битным символом Unicode.
Мы можем вывести любое сообщение или любой символ. однако достаточно сложно вывести на экран кавычки, ведь в них мы и держим значения наших переменных. Для таких случаев мы используем экранирование. С помощью обратной косой черты(обратный слеш) мы экранируем символ или используем её для дополнительных параметров.
Таблица символов Windows (charmap) вызывает и показывает именно те символы, которые можно вызвать в Java.
String #
Мы можем хранить в программе и набор символов: пароль, фамилию, звание, название улицы или просто набор символов. Для хранения таких данных можно использовать String. Пример использования:
Один символ можно записать как “маленьким” стрингом, так и через символ при помощи типа данных char. Цепочку символов, больше одного, мы храним в типе данных String. Каждый элемент этой цепочки символов можно отобразить при помощи char. Это очень важно понять и запомнить.
Строковый набор символов класса String может немного больше, чем просто хранить строчку в переменной. Например, мы можем вычислить количество символов или длину String, используя один из методов, которые есть в Java. Это примерно такие же методы, как те, что мы использовали в предыдущих уроках, чтобы возводить числа в степень или выводить результаты на экран:
Для переменных типа String ява заготовила много дополнительных методов, которые делают нашу жизнь проще. Например, метод substring, который вырезает из одной цепочки символов другую.
Если мы пишем приложение для веб-сайта с “user generated content”, то мы можем столкнуться с тем, что часть контента пишется заглавными буквами. В Java есть методы, которые приводят цепочку символов алфавита к прописным (заглавным) или к строчным (маленьким) буквам. Давайте рассмотрим пример:
С помощью метода toUpperCase() мы делаем буквы прописными, с помощью метода toLowerCase() мы приводим значение строки к строчным буквам.
Мы обязательно вернёмся к этому и другим возможностям класса. Пока надо только запомнить, что, если мы хотим создать записную книжку, то фамилию и имя абонента мы скорее всего будем хранить с помощью типа данных String.
Явные и неявные преобразования #
Значения, передаваемые переменным, можно привести в тот тип данных, которые переменная может принять. Вручную или автоматически, или явно и неявно.

преобразование типов данных
Расширение типа (widening Casting), которое можно проследить на схеме с помощью стрелок, происходит автоматически. Это преобразование меньшего типа данных в типа большего размера: byte -> short -> char -> int -> long -> float -> double.
Сужение типа (narrowing Casting) — преобразование типа данных большего размера в тип данных меньшего размера — делается вручную: double -> float -> long -> int -> char -> short -> byte
Повышение типа на примере
Допустим, у нас имеется старая база данных, где все данные записаны в строковом виде. Например просто текстовый файл столбиком. Java даёт нам возможность “спарсить” целочисленные данные из строк.
Как я могу сделать кавычки для печати на Java, например «Hello»?
Когда я набираю System.out.print(«Hello»); , выход будет Hello . Я ищу «Hello» с кавычками ( «» ).
13 ответов
Символ двойной кавычки должен быть экранирован с помощью обратного слэша в строковом литерале Java. Другие персонажи, нуждающиеся в специальном лечении, включают:
- Возврат каретки и новая строка: «\r» и «\n»
- Обратная косая черта: «\\\\»
- Одиночная цитата: «\'»
- Горизонтальная вкладка и форма подачи: «\t» и «\f»
Полный список строк Java и символьных литералов можно найти в разделе 3.10.6 JLS.
Также стоит отметить, что вы можете включать произвольные символы Unicode в исходный код, используя escape-последовательности Unicode формы «\ uxxxx», где «x» — шестнадцатеричные цифры. Тем не менее, они отличаются от обычных строк и символов escapes тем, что вы можете использовать их в любом месте программы Java. не только в строковых и символьных литералах; см. разделы JLS 3.1, 3.2 и 3.3 для получения подробной информации об использовании Unicode в исходном коде Java.