номер формата и текст в java - учебник java - java programming - учиться java - java basics - java for beginners
- В предыдущих уроках для вывода информации на консоль мы использовали методы print() и println(), которые выводили строки или числа без какого-либо форматирования.
- Элементарное форматирование мы могли реализовать при помощи добавления к строкам дополнительных пробелов или других символов.
- В этом уроке мы познакомимся с методами, которые откроют нам новые возможности для форматирования строк в Java.
Краткое содержание урока:
- Использование printf для форматирования в Java
- Форматирование целых чисел
- Форматирование чисел с плавающей точкой
- Форматирование строк
- Локализация
- Использование String.format
Для начала немного мотивации. Рассмотрим пример, в котором рассчитывается и выводится на консоль таблица умножения:
В данном случае для разделения чисел мы использовали знак табуляции, это дало следующий результат:
Learn java - java tutorial - multiply tab - java examples - java programs
- Таблица выглядит ровно, но она слишком широкая. Для того, чтобы сделать таблицу более компактной, будем использовать метод printf(). Заменим в предыдущем коде строку
на строку
Получим следующий результат:
Learn java - java tutorial - multiply-printf - java examples - java programs
- Как мы видим, таблица стала компактнее. Более того, теперь мы можем уменьшать или увеличивать промежутки между числами по нашему желанию.
- Для этого нужно лишь заменить число 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. Наглядный пример инструкции форматирования в ее полном виде приведен на следующей картинке:
Learn java - java tutorial - java-format - java examples - java programs
- Если мы применим формат с картинки к числу 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. Существуют несколько классов, предназначенных для более сложного форматирования, но их оставим для дальнейших уроков.
- Закончить урок хочется примером, в котором используются форматирование всех изученных в этом уроке типов данных: целых чисел, чисел с плавающей точкой и строк.
- Пример: Таблица курсов валют
Результат вывода на консоль: