Polytech-soft.com

ПК журнал
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java форматированный вывод

Java форматированный вывод

В предыдущих уроках для вывода информации на консоль мы использовали методы 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 знаков, то будет дополнено нулями на недостающее количество знаков.

Читать еще:  Как восстановить удаленные фото с телефона xiaomi

Число будет выровнено по левому краю и, если оно менее 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.util.Formatter. Этот класс обеспечивает преобразование формата, позволяющее выводить числа, строки, время и даты в любом необходимом разработчику виде.

В классе Formatter объявлен метод format(), который преобразует переданные в него параметры в строку заданного формата и сохраняет в объекте типа Formatter. Аналогичный метод объявлен у классов PrintStream и PrintWriter. Кроме того, у этих классов объявлен метод printf() с парамет­рами идентичными параметрам метода format(), который осуществ­ляет форматированный вывод в поток, тогда как метод format() сохраняет изменения в объекте типа Formatter. Таким образом, метод printf()автоматически ис­пользует возможности класса Fomatter и подобен функции printf()языка С.

Класс Formatter преобразует двоичную форму представления данных
в форматированный текст. Он сохраняет форматированный текст в буфере, содержимое которого можно получить в любой момент. Можно предоставить классу Formatterавтоматическую поддержку этого буфера либо задать его явно при создании объекта. Существует возможность сохранения буфера класса Formatter в файле.

Для создания объекта класса существует более десяти конструкторов. Ниже показаны наиболее используемые на моей практике:

Formatter(Appendable buf, Locale loc)

Formatter(String filename) throws FileNotFoundException

Formatter(String filename, String charset)

throws FileNotFoundException, UnsupportedEncodingException

Formatter(File outF) throws FileNotFoundException

В приведенных образцах buf задает буфер для форматированного вывода. Если параметр buf равен null, класс Formatter автоматически размещает объект типа StringBuilder для хранения форматированного вывода. Параметр loc определяет региональные и языковые настройки. Если никаких настроек не задано, используются настройки по умолчанию. Параметр filename задает имя файла, который получит форматированный вывод. Параметр charset опреде­ляет кодировку. Если она не задана, используется кодировка, установленная по умолчанию. Параметр outF передает ссылку на открытый файл, в котором будет храниться форматированный вывод. В параметре outStrm передается ссылка на поток вывода, который будет получать отформатированные данные. Если используется файл, выходные данные записываются в файл.

В классе объявлены следующие методы:

Formatter format(String fmtString, Objectargs) – форматирует аргументы, переданные в аргументе переменной длины args (коли­чество аргументов в списке вывода не фиксировано), в соответствии со спецификаторами формата, содержащимися в fmtString. Возвращает вызывающий объект;

Formatter format(Locale loc, String fmtString,
Objectargs) – форматирует аргументы, переданные в аргументе перемен­ной длины args, в соответствии со спецификаторами формата, содержащимися
в fmtString. При форматировании используются региональные установки, заданные в lос. Возвращает вызывающий объект;

IOException ioException() – если объект, приемник отформатирован­ного вывода, генерирует исключение типа IOException, возвращает это исключение. В противном случае возвращает null;

Locale locale() – возвращает региональные установки вызывающего объекта;

Appendable out() – возвращает ссылку на базовый объект-приемник для выходных данных;

void flush() – переносит информацию из буфера форматирования и произ­водит запись в указанное место выходных данных, находящихся в буфере. Метод чаще всего используется объектом класса Formatter, связанным с файлом;

void close() – закрывает вызывающий объект класса Formatter, что приводит к освобождению ресурсов, используемых объектом. После закрытия объекта типа Formatter он не может использоваться повторно. Попытка использовать закрытый объект приводит к генерации исключения типа
FormatterClosedEception;

Читать еще:  Создание форм в javascript

String toString() – возвращает объект типа String, содержащий отформатированный вывод.

При форматировании используются спецификаторы формата:

Спецификатор форматаВыполняемое форматирование
%aШестнадцатеричное значение с плавающей точкой
%bЛогическое (булево) значение аргумента
%cСимвольное представление аргумента
%dДесятичное целое значение аргумента
%hХэш-код аргумента
%eЭкспоненциальное представление аргумента
%fДесятичное значение с плавающей точкой
%gВыбирает более короткое представление из двух: или %f
%oВосьмеричное целое значение аргумента
%nВставка символа новой строки
%sСтроковое представление аргумента
%tВремя и дата
%xШестнадцатеричное целое значение аргумента
%%Вставка знака %

Так же возможны спецификаторы с заглавными буквами: %A (эквивалентно %a). Форматирование с их помощью обеспечивает перевод символов в верхний регистр.

JLesson 46. Formatter. Форматированный вывод в Java.

При выводе или отображении данных часто их нужно представить в удобочитаемом виде. Чтобы упростить процесс форматирования строковых данных в Java существует специальный класс Formatter, который располагается в пакете java.util. Если до этого вы программировали на языке C, то возможности данного класса покажутся вам знакомыми по сравнению с функцией printf(), предназначенной как раз для форматированного вывода. Внутри библиотеки классов Java возможности Formatter’a используются в методах print() и printf(), а также в классе String — метод format().

Основной метод — format() преобразует переданную строку в ее форматированное представление в соответствие с заданным шаблоном. Чтобы понять работу Formatter’a лучше всего рассмотреть практический пример.

Объект класса Formatter можно получить, вызвав один из нескольких предопределенных конструкторов. Ниже перечислены только некоторые из них.

Наиболее часто используемый вариант, наверное, первый. Если вы заглянете в официальную документацию, то увидите, что для создания форматтера предусмотрено еще больше вариантов. Дело в том, что при вызове метода format(), отформатированная строка сохраняется внутри класса Formatter в локальный буфер. По умолчанию буфером служит объект класса StringBuffer. Но тип буфера можно задать и самому. Вот здесь то и становится понятным предназначение каждого из конструкторов. Если хотите писать весь форматированный вывод в файл — пожалуйста. Хотите в поток? У нас есть и такая возможность. На практике это может оказаться очень удобным. В случае использования пустого конструктора языковые настройки и кодировка будут установлены по умолчанию.

Форматирование — это просто!

Теперь рассмотрим само форматирование поближе. У класса Formatter есть два варианта метода format():

Ну здесь на самом деле все просто. Первый вариант в качестве дополнительного параметра принимает локаль для настройки языка, второй использует настройки по умолчанию. Следующим параметром задается формат отображения. Вот тут и начинается все самое интересное. Формат записывается при помощи спецификаторов формата. Например, цифра записывается как %d, число с плавающей точкой — %f, а строка — %s. После формата должны быть перечислены через запятую переменные соответствующих типов.

Рассмотрим пример. После создания форматтера, мы вызываем его метод format() и определяем само представление в виде строки. Спецификаторы %f и %s при форматировании будут заменены на значения соответствующих типов, которые перечислены далее через запятую. Если типы будут не совпадать (даже если они просто идут в другом порядке), то будет выброшено исключение IllegalFormatException. В итоге был получен следующий вывод:

Спецификаторы формата могут записываться с большой буквы. В этом случае строка будет записана в верхнем регистре. Таблица с перечислением набора спецификаторов формата приведена ниже:

%aШестнадцатеричное число с плавающей точкой
%bБулево значение
%cСимвол
%dДесятичное целое
%eЧисло в научной записи
%fДесятичное число с плавающей точкой
%hХеш-код от аргумента
%oВосьмеричное целое
%nСимвол переноса строки
%tВремя
%xШестнадцатеричное целое

Ограничение на длину аргументов.

Вы можете также задавать предполагаемую ширину поля, которое должен занимать передаваемый аргумент. Например, число состоит максимум из 5 цифр. Спецификатор формата можно дополнить и записать как %5d. Если число будет, например, двузначным, то оставшиеся позиции заполнятся пробелами. Если число будет содержать больше цифр, то они будут выведены все. В случае, когда вы хотите дополнить их, например, нулями, то можно это написать как %05d. Например:

Форматирование чисел и строк java с примерами

Вы пытались когда-нибудь изучать документацию по форматированию строк на Java? Лично мне было трудно разобраться в официальной справке. Это руководство позволит внести ясность и упростить использование форматирования строк(string format java) и чисел.

Самый распространенный способ форматирования String.format().

Для форматированного вывода на консоль вы можете использовать printf() или метод format() System.out и System.err PrintStreams.

Стандартный поток вывода (System.out) и стандартный поток вывода ошибок (System.err) имеют тип PrintStream, так что это означает, что вы научитесь использовать метод System.out.format() и System.err. метод format(), а также метод String.format(). Синтаксис этого метода одинаков во всех классах: формат (формат строки, объект … аргументы).
String состоит из статического текста, встроенного со спецификаторами формата, которые должны соответствовать следующему синтаксису: %[argument_index$][flags][width][.precision]conversion.

Элементы внутри скобок являются необязательными. Давайте разберемся с каждым элементом:

  • Знак % указывает на начало спецификатора формата.
  • Необязательный аргумент arguments_index — это десятичное целое число, указывающее позицию аргумента в списке аргументов. На первый аргумент ссылается «1$», на второй — «2$» и т. д.
  • flags — это набор символов, которые изменяют формат вывода.
  • width представляет собой положительное десятичное целое число, указывающее минимальное количество символов, которое должно быть записано в вывод.
  • precision — неотрицательное десятичное целое число, обычно используемое для ограничения количества символов.
  • conversion — это символ, указывающий, как аргумент должен быть отформатирован.

Метод printf() делает то же самое, что и метод format().
Метод format (String format, Object… args) форматирует строку по умолчанию.
Метод format (locale locale, String format, Object… args) форматирует строку в соответствии с указанным стандартом.

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

Спецификаторы формата Java

Вот краткий справочник по всем поддерживаемым спецификаторам.

Читать еще:  Восстановить загрузчик windows 10 из командной строки
СпецификаторТипВывод
%afloating point (except BigDecimal)Шестнадцатеричный вывод числа с плавающей запятой
%bAny type“true” если не 0, “false” если 0
%ccharacterЮникод
%dinteger (incl. byte, short, int, long, bigint)Десятичное целое
%efloating pointдесятичное число в научной записи
%ffloating pointдесятичное число
%gfloating pointдесятичное число, возможно, в научных обозначениях в зависимости от точности и значения.
%hany typeШестнадцатеричная строка значения из метода hashCode ().
%nnoneСпецифичный для платформы разделитель строк.
%ointeger (incl. byte, short, int, long, bigint)Восьмеричное число
%sany typeСтроковое значение
%tDate/Time (incl. long, Calendar, Date and TemporalAccessor)% t — это префикс для преобразования даты / времени.
%xinteger (incl. byte, short, int, long, bigint)Шестнадцатеричная строка.

Форматирование даты и времени Java

Использование символов форматирования с «%T» вместо «%t» приводит к выводу заглавных букв.

  • %tA Полное название дня недели, например, «Воскресение понедельник»
  • %ta Сокращенное название дня недели, например, «Солнце», «Пн» и др.
  • %tB Полное название месяца, например «Январь», «Февраль» и др.
  • %tb Сокращенное название месяца, например «Январь», «февраль» и т. Д.
  • %tC Century часть года, отформатированная двумя цифрами, например, «00» — «99».
  • %tc Дата и время в формате «% ta% tb% td% tT% tZ% tY», например «Пт 17 февраля 07:45:42 PST 2017»
  • %tD Дата в формате «% tm /% td /% ty»
  • %td День месяца в формате двух цифр. например «01» до «31».
  • %te День месяца, отформатированный без начального 0, например От «1» до «31».
    Дата в формате% tF ISO 8601 с «% tY-% tm-% td».
  • %tH час дня для 24-часовых часов, например «00» — «23».
  • %th То же, что% tb.
  • %tI Час дня для 12-часовых часов, например «01» — «12».
  • %tj День года, отформатированный с ведущими 0, например «001» — «366».
  • %tk Час дня для 24-часовых часов без ведущего 0, например От «0» до «23».
  • %tl Час дня для 12-часового клика без ведущего 0, например «1» до «12».
  • %tM Минуты в течение часа, отформатированные в начале 0, например От «00» до «59».
  • %tm Месяц отформатирован с начальным 0, например «01» — «12».
  • %tN наносекунда, отформатированная с 9 цифрами и начальными 0, например. «000000000» — «999999999».
  • %tp Специфичный для локали маркер «am» или «pm».
  • %tQ Миллисекунды с 1 января 1970 г. 00:00:00 UTC.
  • %tR Время отформатировано как 24 часа, например «% ЧТ:% ТМ».
  • %tr Время отформатировано как 12 часов, например «% TI:% tM:% tS% Tp».
  • %tS секунды в течение минуты, отформатированные с 2 цифрами, например, От «00» до «60». «60» требуется для поддержки високосных секунд.
  • %ts Секунды с 1 января 1970 г. 00:00:00 UTC.
  • %tT Время отформатировано как 24 часа, например «% ЧТ:%: Tm% Ts».
  • %tY Год отформатирован 4 цифрами, например «0000» — «9999».
  • %ty Год форматируется двумя цифрами, например От «00» до «99».
  • %tZ Сокращение часового пояса. например «UTC», «PST» и т. Д.
  • %T — Смещение часового пояса от GMT, например «-0800».

Аргумент задается как число, заканчивающееся на «$» после «%», и выбирает указанный аргумент в списке аргументов.

Форматирование целых чисел

С помощью спецификатора формата %d можно использовать аргумент всех целочисленных типов, включая byte, short, int, long и BigInteger.

Форматирование по умолчанию:

Выравнивание по левому краю в пределах указанной ширины:

Вывести положительные числа со знаком «+»:
(Отрицательные числа всегда включают «-»):

Пробел перед положительными числами.

Заключить отрицательные числа в круглые скобки («()») и пропустить «-»:

Альтернативное представление для восьмеричного и шестнадцатеричного вывода:

Печатает восьмеричные числа с начальным «0» и шестнадцатеричные числа с начальным «0x».

Форматирование строк и символов

Форматирование по умолчанию:

Печатает всю строку.

С указанием длины поля:

Выравнивание текста по левому краю:

Вывести максимальное количество символов:

Задать ширину поля и максимальное количество символов:

Примеры

Следующий код форматирует строку, целое число и число с плавающей запятой с точностью до 2 чисел после десятичной точки (.2f):

Вывод:
Effective Java is a great book. It is sold at 33.95 USD today.

В следующем примере используется флаг ‘-‘ для выравнивания по левому краю строк с шириной 30 символов:

В следующем примере печатаются числа как в десятичном формате (%d), так и в шестнадцатеричном формате (%x and %#x):

Обратите внимание, что есть два спецификатора формата, но только один аргумент, поэтому мы используем индекс аргумента 1$, чтобы указать позицию аргумента для спецификатора. Вывод:
Min value of a byte: -128 (0x80)
Max value of a byte: 127 (0x7f)
Min value of an int: -2147483648 (80000000)
Max value of an int: 2147483647 (7fffffff)

Следующий код использует префикс t с преобразованиями даты и времени (T, F и D) для записи отформатированных строк текущего времени и даты в текстовый файл:

На выходе получаем файл (datetime.txt), который будет иметь следующее содержимое:
Now is 23:25:11
Today is 2016-12-14
Today is 12/14/16

Следующий код форматирует объект Date в строку, используя полное локальное имя дня недели (tA), полное имя месяца (tB), день месяца (td) и год из 4 цифр (tY):

Метод String.format() возвращает отформатированную строку, укажите Today is Wednesday December 14, 2016

Теперь форматируем вывод, чтобы он выглядел как столбцы:

И самое сложное выполним форматирование чисел в Java с добавлением нуля для чисел менее 5 символов (%05d); заключим в скобки отрицательные числа (%(d) и включим знак для чисел (% + d):

Получим:
00012
02016
00365
19001800
(1234)
+567
-891

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

Ссылка на основную публикацию
Adblock
detector