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$ — данный формат применяется к первому аргументу, который находится после строки форматирования. В данном примере это было указывать не обязательно.
Читайте также:  Led backlight что это

Пример 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. Научимся выводить числа с заданной точностью.

Методы printf и format

Пакет java.io содержит класс PrintStream, который содержит эти два метода, эти методы можно использовать вместо print и println. Объект System.out, который вы уже использовали — это объект PrintStream, поэтому вы можете вызывать методы PrintStream используя System.out. Например:

Синтаксис методов одинаков:

где format — это строка которая определяет шаблон, согласно которому будет происходить форматирование, args — это список переменных, для печати по заданному шаблону. Простой пример:

Строка format содержит обычный текст и специальные форматирующие символы. Эти символы начинаются со знака процента (%) и заканчиваются конвертером — символом, который определяет тип переменной для форматирования. Пример:

Читайте также:  Как зарегистрироваться в youtube на телефоне

Спецификатор %d определяет одну десятичную целую переменную. %n — переход на новую линию. Данный пример выведет:

Пример

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

Конвертеры и флаги используемые в TestFormat.java

Конвертер Флаг Описание
d Десятичное целое.
f Float.
n Символ новой строки в зависимости от платформы, на которой запущена программа. Вместо
лучше использовать %n.
tB Дата и время — полное название месяца в зависимости от языка.
td, te Дата и время — 2 цифры дня месяца. td — с ведущими нулями, te — без.
ty, tY Дата и время — ty = год из 2х цифр, tY = год из 4х цифр.
tl Дата и время — часы в 12 часовом формате.
tM Дата и время — минуты из 2х цифр с ведущими нулями.
tp Дата и время — am/pm в зависимости от языка(в нижнем регистре).
tm Дата и время — месяц — 2 цифры с ведущими нулями.
tD Дата и время — дата в формате %tm%td%ty
08 Восемь символов с ведущими нулями при необходимости.
+ Включить знак (положительный или отрицательный).
По левому краю
.3 Три символа после запятой
10.3 Десять символов до запятой и три — после.

Примеры использования этих конвертеров вы можете увидеть далее. Эта программа показывает различные варианты использования метода format. Вывод показан в комментариях.

Класс DecimalFormat

Вы можете использовать класс DecimalFormat для контроля вывода нулей в десятичных числах. Пример:

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

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

Спецификатор Тип Вывод
%a floating point (except BigDecimal) Шестнадцатеричный вывод числа с плавающей запятой
%b Any type “true” если не 0, “false” если 0
%c character Юникод
%d integer (incl. byte, short, int, long, bigint) Десятичное целое
%e floating point десятичное число в научной записи
%f floating point десятичное число
%g floating point десятичное число, возможно, в научных обозначениях в зависимости от точности и значения.
%h any type Шестнадцатеричная строка значения из метода hashCode ().
%n none Специфичный для платформы разделитель строк.
%o integer (incl. byte, short, int, long, bigint) Восьмеричное число
%s any type Строковое значение
%t Date/Time (incl. long, Calendar, Date and TemporalAccessor) % t — это префикс для преобразования даты / времени.
%x integer (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. Количество голосов:

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

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

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