- Android studio форматированный вывод
- Использование printf для форматирования в Java
- Форматирование целых чисел
- Форматирование чисел с плавающей точкой
- Форматирование строк
- Локализация
- Использование String.format
- Как отформатировать строку в Java с примерами
- Вступление
- System.out.printf()
- Спецификаторы Формата
- Escape-символы
- Основное Использование
- Поплавок и двойная точность
- Заполнение Формата
- Git Essentials
- Место действия
- Индекс Аргументов
- System.out.формат()
- Строка.формат()
- Класс форматирования
- Формат сообщения
- Вывод
Android studio форматированный вывод
В предыдущих уроках для вывода информации на консоль мы использовали методы print() и println(), которые выводили строки или числа без какого-либо форматирования. Элементарное форматирование мы могли реализовать при помощи добавления к строкам дополнительных пробелов или других символов. В этом уроке мы познакомимся с методами, которые откроют нам новые возможности для форматирования строк в Java.
Краткое содержание урока:
Для начала немного мотивации. Рассмотрим пример, в котором рассчитывается и выводится на консоль таблица умножения:
В данном случае для разделения чисел мы использовали знак табуляции, это дало следующий результат:
Таблица выглядит ровно, но она слишком широкая. Для того, чтобы сделать таблицу более компактной, будем использовать метод printf(). Заменим в предыдущем коде строку
Получим следующий результат:
Как мы видим, таблица стала компактнее. Более того, теперь мы можем уменьшать или увеличивать промежутки между числами по нашему желанию. Для этого нужно лишь заменить число 4 в выражении «%4d».
Далее рассмотрим метод printf() и его возможности подробнее.
Использование printf для форматирования в Java
Метод printf() принадлежит классу PrintStream, который отвечает за вывод информации. Уже знакомые нам методы print() и println() также являются методами класса PrintStream.
Метод printf определен следующим образом:
Первый аргумент format это строка, определяющая шаблон, согласно которому будет происходить форматирование. Для ее записи существуют определенные правила.
В предыдущем примере формат был «%4d», где d означает вывод десятичного целого числа, а 4 — означает то, что если количество знаков в числе меньше, чем 4, то оно будет спереди дополнено пробелами на недостающее (до 4-х) количество знаков (тем самым подвинуто вправо).
Для наглядности приведем еще один пример, который выводит столбиком несколько чисел.
На консоль будет выведено:
Здесь в строке форматирования мы использовали несколько раз %6d%n, где каждое %6d задает формат для одного из чисел, указанных далее в качестве аргументов. Первое %6d форматирует число 666666, второе %6d форматирует 55555 и т.д. %n означает перевод строки. Поскольку ко всем числам было применено форматирование %6d, то числа, которые содержат менее 6 знаков подвинуты вправо на недостающее количество знаков и тем самым красиво выровнены.
Данный пример иллюстрирует также то, что метод printf может содержать несколько аргументов после строки с форматом. На что указывает Object… args в сигнатуре метода. Эти аргументы должны соответствовать ссылкам на них в строке формата. Например, если в строке формата стоит символ d, отвечающий за вывод целого десятичного числа, а далее в аргументе вы укажете строку, при компиляции произойдет ошибка преобразования формата java.util.IllegalFormatConversionException. Если аргументов больше, чем определено в формате, то лишние аргументы будут игнорироваться.
Общий вид инструкции форматирования следующий:
- % — специальный символ, обозначающий начало инструкций форматирования.
- [argument_index$] — целое десятичное число, указывающее позицию аргумента в списке аргументов. Ссылка на первый аргумент «1$» , ссылка на второй аргумент «2$» и т.д. Не является обязательной частью инструкции. Если позиция не задана, то аргументы должны находиться в том же порядке, что и ссылки на них в строке форматирования.
- [flags] — специальные символы для форматирования. Например, флаг «+» означает, что числовое значение должно включать знак +, флаг «-» означает выравнивание результата по левому краю, флаг «,» устанавливает разделитель тысяч у целых чисел. Не является обязательной частью инструкции.
- [width] — положительное целое десятичное число, которое определяет минимальное количество символов, которые будут выведены. Не является обязательной частью инструкции.
- [.precision] — не отрицательное целое десятичное число с точкойперед ним. Обычно используется для ограничения количества символов. Специфика поведения зависит от вида преобразования. Не является обязательной частью инструкции.
- conversion — это символ, указывающий, как аргумент должен быть отформатирован. Например d для целых чисел, s для строк, f для чисел с плавающей точкой. Является обязательной частью инструкции.
Все возможные флаги и преобразования (conversion) указаны в официальной документации. Здесь мы не ставим цель изучить их все, наша цель — научиться применять форматирование. Поэтому рассмотрим несколько примеров.
Пример 1. Наглядный пример инструкции форматирования в ее полном виде приведен на следующей картинке:
Если мы применим формат с картинки к числу Pi
Получим следующий результат на консоли:
Разберем данную инструкцию с конца:
- f — указывает на то, что выводим число с плавающей точкой.
- .10 — выведенное число будет содержать 10 знаков после запятой.
- 20 — всего выведенное число будет иметь ширину в 20 символов
- +0 — недостающие (до 20-ти) символы будут заполнены нулями, перед числом будет указан знак (+)
- 1$ — данный формат применяется к первому аргументу, который находится после строки форматирования. В данном примере это было указывать не обязательно.
Пример 2. Рассмотрим пример демонстрирующий вывод на консоль до знакомства с форматированием и после.
Без форматирования
На консоль будет выведено:
В этом случае преобразование кода в строку автоматически генерируется компилятором Java. Этот способ плох тем, что при большом количестве переменных и текста для вывода, легко потерять контроль над результатами.
С форматированием
Где %d отвечает за вывод значения переменной i, а %f за вывод значения переменной root. При этом мы уже не используем конкатенацию.
На консоль будет выведено:
Как мы видим, формат автоматически округляет число до 6 знаков после запятой. Однако, при форматировании мы можем устанавливать такое количество знаков после запятой, которое нам нужно, например:
Выведет число с двумя знаками после запятой.
Далее на примерах рассмотрим наиболее популярные правила форматирования.
Форматирование целых чисел
Вывод целого числа
Вывод целого числа с разделением тысяч
Число менее 7 знаков будет «подвинуто» вправо на недостающее количество знаков.
Число менее 7 знаков будет дополнено нулями слева на недостающее количество знаков.
Число будет дополнено знаком + и, если оно менее 7 знаков, то будет дополнено нулями на недостающее количество знаков.
Число будет выровнено по левому краю и, если оно менее 7 знаков, то будет дополнено пробелами справа на недостающее количество знаков.
Разумеется вместо 7 можно использовать любое другое положительное целое число.
Форматирование чисел с плавающей точкой
Вывод числа e. Автоматическое округление до 6 знаков после запятой.
Число менее 10 знаков будет «подвинуто» вправо на недостающее количество знаков.
Число менее 10 знаков будет дополнено нулями слева на недостающее количество знаков.
Число будет дополнено знаком + и, если оно менее 10 знаков, то будет дополнено нулями на недостающее количество знаков.
Число будет выведено с 15 знаками после запятой.
Число будет выведено с 3-мя знаками после запятой и, если оно менее 8 символов, то будет «подвинуто» вправо на недостающее количество знаков.
Число будет выровнено по левому краю, выведено с 3-мя знаками после запятой и, если оно менее 8 знаков, то будет дополнено пробелами справа на недостающее количество знаков.
Форматирование строк
Если строка содержит менее 10 символов, то «подвинуть » ее вправо на недостающее количество символов.
Строка будет выровнена по левому краю и, если она менее 10 символов, то будет дополнена справа пробелами на недостающее количество символов.
Выведет первые 3 символа строки.
Выведет первые 3 символа строки и подвинет их вправо на недостающее до 8 количество символов.
Локализация
В разных странах некоторые записи принято производить по-разному. Например, в одних странах дробное число принято писать с точкой «3.68», а в других с запятой «3,68». Java нам позволяет соблюдать эти традиции. Метод printf имеет еще одну сигнатуру:
printf(Locale l, String format, Object… args)
Первым аргументом стоит Locale l, который и определяет локализацию. Для того, чтобы использовать локализацию необходимо вначале файла с вашим кодом импортировать библиотеку java.util.Locale.
Рассмотрим несколько примеров применения:
В зависимости от указанной страны используются разные разделители для тысяч.
В зависимости от указанной страны используются разные разделители у дробных чисел.
Использование String.format
В случае, если нет необходимости выводить отформатированную строку, а нужно просто ее сохранить для дальнейшего использования (например, для записи в лог или базу данных) следует использовать метод format из класса String. Принципы форматирования в этом случае абсолютно такие же, как у описанного выше printf, но этот метод вместо вывода строки сохраняет ее как отформатированную строку.
Это далеко не все возможности форматирования в Java. Существуют несколько классов, предназначенных для более сложного форматирования, но их оставим для дальнейших уроков.
Закончить урок хочется примером, в котором используются форматирование всех изученных в этом уроке типов данных: целых чисел, чисел с плавающей точкой и строк.
Пример: Таблица курсов валют
Результат вывода на консоль:
Полезные ссылки из официальной документации:
Источник
Как отформатировать строку в Java с примерами
В этом уроке мы будем форматировать строки на Java с помощью printf (), System.format (), String.format(), классов форматирования и форматирования сообщений.
Автор: Luka Čupić
Дата записи
Вступление
В Java существует несколько способов форматирования строк. Некоторые из них старой школы и заимствованы непосредственно из старой классики (например, printf из C), в то время как другие больше соответствуют духу объектно-ориентированного программирования, например, класс MessageFormat .
В этой статье мы рассмотрим несколько из этих подходов. Мы покажем некоторые особенности того, как можно использовать каждую из техник и в каких обстоятельствах. Используя эти знания, вы будете знать, как подходить к форматированию строк и какие методы использовать.
System.out.printf()
Давайте начнем со старой классики, printf() . Как упоминалось ранее, printf() происходит из языка программирования C и расшифровывается как формат печати . Под капотом printf() использует java.util.Форматер , о котором мы поговорим позже.
То, как работает printf () , можно объяснить его аргументами. Наиболее распространенный способ использования printf() заключается в следующем:
Мы видим, что метод ожидает формат и vararg аргументы . Аргумент format определяет способ форматирования строки – шаблон для конечного результата.
Например, вы можете напечатать десятичное число с точностью до семи знаков после запятой или число в шестнадцатеричном представлении. Или у вас может быть предопределенное сообщение для приветствия пользователей, но вы хотели бы отформатировать его, чтобы включить имя пользователя.
аргументы vararg удобно ожидает аргументы (т. Е. Значения) для строки шаблона. Например, если шаблон содержит заполнители для двух чисел, метод printf() также будет ожидать два числа в качестве аргументов :
Мы поместили два символа %d в строку шаблона. Эти два символа представляют собой заполнители для определенного типа значений. Например, %d является заполнителем для десятичного числового значения. Поскольку у нас их два, мы должны передать два аргумента, соответствующих числовым значениям, таким как 42 и 23 .
Выполнение этого кода приведет к:
Спецификаторы Формата
С помощью printf () вы можете печатать такие значения , как числа, строки, даты и т.д. Чтобы метод знал, что именно вы пытаетесь распечатать, вам необходимо указать спецификатор формата для каждого из значений. Давайте рассмотрим пример:
В случае выполнения этот код выведет Привет, читатель на консоль. Символ %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-символы
В дополнение к описанным выше спецификаторам формата существует еще один тип символов форматирования: Escape-символы.
Давайте представим, что мы хотим напечатать символ » с помощью printf() . Мы можем попробовать что-то вроде:
Если вы попытаетесь запустить это, ваш компилятор наверняка выдаст исключение. Если вы посмотрите внимательно, даже код, который выделяет код на этой странице, выделит ); как строку, а не закрытую скобку метода.
Произошло то, что мы попытались напечатать символ, который имеет особое, скрытое значение. Кавычки используются для обозначения начала и конца строки.
Мы начали и закончили строку «» , после чего открыли другую » , но не закрыли ее. Это делает печать зарезервированных символов, подобных этому , невозможной при использовании этого подхода.
Способ обойти это – сбежать . Чтобы напечатать специальные символы (такие как » ) напрямую, нам сначала нужно избежать его эффектов, а в Java это означает добавление к нему обратной косой черты ( \ ). Чтобы законно напечатать кавычки на Java, мы бы сделали следующее:
Комбинация \ и » конкретно указывает компилятору, что мы хотели бы вставить символ » в это место и что он должен рассматривать » как конкретное значение, а не зарезервированный символ.
Применение escape-символа \ может вызвать различные эффекты, основанные на последующем. Передача обычного символа (не зарезервированного) ничего не даст, и \ будет рассматриваться как значение.
Хотя некоторые комбинации (также называемые командами) имеют другое значение для компилятора:
- \b – Вставить пробел
- \f – Первый символ следующей строки начинается справа от последнего символа текущей строки
- \n – Вставить новую строку
- \r – Вставить возврат каретки
- \t – Вставка вкладки
- \\ – Вставить обратную косую черту
- %% – Вставить знак процента
Таким образом, вы бы использовали \n для печати разделителя строк на консоль, эффективно начиная любое новое содержимое с начала следующей строки. Аналогично, для добавления вкладок вы бы использовали спецификатор \t .
Возможно, вы заметили %% в качестве последней комбинации.
Почему это так? Почему \% просто не используется?
Символ % уже является escape-символом специально для метода printf () . За ними следуют такие символы, как d , i , f и т.д., форматер во время выполнения знает, как обрабатывать эти значения.
Однако символ \ предназначен для компилятора. Он указывает, куда и что вставлять. Команда \% просто не определена, и мы используем % escape – символ, чтобы избежать эффекта последующего % символа-если это имеет смысл.
Для компилятора % не является специальным символом, но \ является. Кроме того, это условно, что специальные символы сами убегают. \ сбегает \ и % сбегает % .
Основное Использование
Давайте отформатируем строку с несколькими аргументами разных типов:
Поплавок и двойная точность
С помощью printf () мы можем определить пользовательскую точность для чисел с плавающей запятой:
Поскольку %f используется для поплавков, мы можем использовать его для печати double s. Однако, добавив .n , где n – количество знаков после запятой, мы можем определить пользовательскую точность.
Выполнение этого кода дает:
Заполнение Формата
Мы также можем добавить заполнение, включая переданную строку:
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Здесь после символа % мы передали число и спецификатор формата. В частности, нам нужна строка с 10 символы, за которыми следует новая строка. Поскольку stack содержит только 5 символов, еще 5 добавляются в качестве дополнения, чтобы “заполнить” строку целевым символом:
Вместо этого вы также можете добавить отступ справа:
Место действия
Мы также можем передать Locale в качестве первого аргумента, отформатировав строку в соответствии с ним:
Это приведет к получению двух целых чисел разного формата:
Индекс Аргументов
Если индекс аргумента не указан, аргументы будут просто следовать порядку присутствия в вызове метода:
Это привело бы к:
Однако после % escape-символа и перед спецификатором формата мы можем добавить другую команду. $n укажет индекс аргумента:
Здесь 2$ находится между % и d . 2$ указывает, что мы хотели бы прикрепить второй аргумент из списка аргументов к этому спецификатору. Аналогично, 1$ указывает, что мы хотели бы присоединить первый аргумент из списка к другому указанному.
Выполнение этого кода приводит к:
Вы можете указать обоим спецификаторам на один и тот же аргумент. В нашем случае это означало бы, что мы используем только один аргумент, указанный в списке. Это совершенно нормально, хотя нам все равно придется указать все аргументы, присутствующие в строке шаблона:
System.out.формат()
Прежде чем говорить о System.out.format() , давайте кратко остановимся на System.out .
Все системы UNIX имеют три основных канала – стандартный входной канал ( stdin ), стандартный выходной канал ( stdout ) и стандартный канал ошибок ( stderr ). Поле out соответствует каналу stdout и имеет тип PrintStream .
Этот класс имеет множество различных методов для печати форматированных текстовых представлений в поток, некоторые из которых являются format() и printf() .
Согласно документации, они оба ведут себя совершенно одинаково . Это означает, что между ними нет разницы, и их можно использовать для одних и тех же результатов. Все, что мы до сих пор говорили о printf () , также работает для format() .
Как printf () , так и System.out.format() печать в канал stdout , который обычно нацелен на консоль/терминал.
Строка.формат()
Другим способом форматирования строк является метод String.format() , который внутренне также использует java.util.Форматер , который мы рассмотрим в следующем разделе.
Основным преимуществом String.format() над printf() является его тип возврата – он возвращает Строку . Вместо того, чтобы просто печатать содержимое в стандартном выходном канале и не иметь возвращаемого типа ( void ), как это делает printf () , String.format() используется для форматирования строки, которую можно использовать или повторно использовать в будущем:
Теперь вы можете делать все, что захотите, с отформатированной строкой . Вы можете распечатать его, сохранить в файл, изменить или сохранить в базе данных. Печать этого приведет к:
Метод String.format() использует тот же базовый принцип, что и метод printf () . Оба внутренне используют класс Форматирования для фактического форматирования строк. Таким образом, все, что сказано для printf () , также относится к методу String.format () .
Использование printf() , String.format() или Форматирования по сути одно и то же. Единственное, что отличается, – это тип возврата – printf() выводит в стандартный поток вывода (обычно на вашу консоль) и String.format() возвращает отформатированную строку .
Тем не менее, String.format() более универсален, поскольку вы действительно можете использовать результат более чем одним способом.
Класс форматирования
Поскольку все вышеперечисленные методы по своей сути вызывают Форматер , знание только одного означает, что вы знаете их все.
Использование Форматирования очень похоже на другие методы, показанные ранее. Самая большая разница заключается в том, что для его использования необходимо создать экземпляр Форматера объекта:
В связи с этим возникает вопрос:
Почему бы мне не всегда просто использовать предыдущие методы, поскольку они более лаконичны?
Есть еще одно важное различие, которое делает класс Форматер довольно гибким:
Вместо работы только с String s, Форматер также может работать с StringBuilder , что позволяет (повторно)эффективно использовать оба класса.
На самом деле, Форматер способен работать с любым классом, реализующим Добавляемый интерфейс. Одним из таких примеров является вышеупомянутый StringBuilder , но другие примеры включают такие классы, как BufferedWriter , Файловая машина , Поток печати , PrintWriter , StringBuffer и т.д. Полный список можно найти в документации .
Наконец, все спецификаторы формата, escape-символы и т. Д. Также допустимы для класса форматирования , Поскольку это основная логика форматирования строк во всех трех случаях: String. format() , printf () и Форматирование .
Формат сообщения
Наконец, давайте покажем один последний метод форматирования, который не использует Форматер под капотом.
Формат сообщения был создан для создания и предоставления объединенных сообщений нейтральным к языку способом. Это означает, что форматирование будет одинаковым, независимо от того, используете ли вы Java, Python или какой-либо другой язык, поддерживающий MessageFormat .
Формат сообщения расширяет абстрактный Формат класс, точно так же, как Формат даты и Формат числа . Класс Format предназначен для форматирования объектов, зависящих от языкового стандарта, в строки.
Давайте рассмотрим хороший пример, любезно предоставленный Формат сообщения s документация .
Кодовый кредит: Документы Oracle
На выходе получается:
Вместо спецификаторов процента, которые мы видели до сих пор, здесь мы используем фигурные скобки для каждого из аргументов. Давайте возьмем первый аргумент, <1, время>. Число 1 представляет индекс аргумента, который следует использовать вместо него. В нашем случае аргументами являются планета , новая дата () и событие .
Вторая часть, время , относится к типу значения. Типы форматов верхнего уровня: число , дата , время и выбор . Для каждого из значений можно сделать более конкретный выбор, например, с помощью <0, число, целое число>, в котором говорится, что значение следует рассматривать не только как число, но и как целое число.
Полный набор типов и подтипов форматов можно найти в документации .
Вывод
В этой статье мы рассмотрели довольно много способов форматирования строк в ядре Java.
Каждая из техник, которые мы показали, имеет свою собственную причину существования. printf() , например, напоминает метод C старой школы с тем же названием.
Другие подходы, такие как Форматирование или Формат сообщений , предлагают более современный подход, который использует некоторые преимущества объектно-ориентированного программирования.
Каждая техника имеет конкретные варианты использования, поэтому, надеюсь, вы сможете знать, когда использовать каждую из них в будущем.
Источник