Форматируем вывод чисел в Java
В этом уроке мы поговорим о формате вывода чисел в Java. Научимся выводить числа с заданной точностью.
Методы printf и format
Пакет java.io содержит класс PrintStream, который содержит эти два метода, эти методы можно использовать вместо print и println. Объект System.out, который вы уже использовали — это объект PrintStream, поэтому вы можете вызывать методы PrintStream используя System.out. Например:
System.out.format(. );
Синтаксис методов одинаков:
public PrintStream format(String format, Object. args)
где format — это строка которая определяет шаблон, согласно которому будет происходить форматирование, args — это список переменных, для печати по заданному шаблону. Простой пример:
System.out.format("The value of " + "the float variable is " + "%f, while the value of the " + "integer variable is %d, " + "and the string is %s", floatVar, intVar, stringVar);
Строка format содержит обычный текст и специальные форматирующие символы. Эти символы начинаются со знака процента (%) и заканчиваются конвертером — символом, который определяет тип переменной для форматирования. Пример:
int i = 461012; System.out.format("The value of i is: %d%n", i);
Спецификатор %d определяет одну десятичную целую переменную. %n — переход на новую линию. Данный пример выведет:
The value of i is: 461012
Пример
Следующая таблица содержит некоторые флаги, которые используются в программе ниже.
| Конвертер | Флаг | Описание |
|---|---|---|
| d | Десятичное целое. | |
| f | Float. | |
| n | Символ новой строки в зависимости от платформы, на которой запущена программа. Вместо \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. Вывод показан в комментариях.
import java.util.Calendar; import java.util.Locale; public class TestFormat < public static void main(String[] args) < long n = 461012; System.out.format("%d%n", n); // -->"461012" System.out.format("%08d%n", n); // --> "00461012" System.out.format("%+8d%n", n); // --> " +461012" System.out.format("%,8d%n", n); // --> " 461,012" System.out.format("%+,8d%n%n", n); // --> "+461,012" double pi = Math.PI; System.out.format("%f%n", pi); // --> "3.141593" System.out.format("%.3f%n", pi); // --> "3.142" System.out.format("%10.3f%n", pi); // --> " 3.142" System.out.format("%-10.3f%n", pi); // --> "3.142" System.out.format(Locale.FRANCE, "%-10.4f%n%n", pi); // --> "3,1416" Calendar c = Calendar.getInstance(); System.out.format("%tB %te, %tY%n", c, c, c); // --> "May 29, 2006" System.out.format("%tl:%tM %tp%n", c, c, c); // --> "2:34 am" System.out.format("%tD%n", c); // --> "05/29/06" > >
Класс DecimalFormat
Вы можете использовать класс DecimalFormat для контроля вывода нулей в десятичных числах. Пример:
import java.text.*; public class DecimalFormatDemo < static public void customFormat(String pattern, double value ) < DecimalFormat myFormatter = new DecimalFormat(pattern); String output = myFormatter.format(value); System.out.println(value + " " + pattern + " " + output); >static public void main(String[] args) < customFormat("###,###.###", 123456.789); customFormat("###.##", 123456.789); customFormat("000000.000", 123.78); customFormat("$###,###.###", 12345.67); >>
Данная программа выведет:
123456.789 ###,###.### 123,456.789 123456.789 ###.## 123456.79 123.78 000000.000 000123.780 12345.67 $###,###.### $12,345.67
Класс PrintStream
Класс PrintStream предоставляет все возможности, которые знакомы по System.out. Поддерживает методы print(), println() и printf().
Методы print() и println()
Очень часто программисты используют методы print() и println() для временной отладки. Особо говорить о них нечего.
Метод printf()
При сложном выводе строки удобнее её сначала отформатировать, чтобы результат выглядел красивым. Допустим, мы хотим распечатать таблицу умножения от 1 до 10. В качестве разделителя будем использовать символ табуляции
int[][] multiplyTable = new int[10][10]; for (int i = 0; i < 10; i++) < for (int j = 0; j < 10; j++) < multiplyTable[i][j] = (i + 1) * (j + 1); // используем символ табуляции System.out.print(multiplyTable[i][j] + "\t"); >System.out.println(); >
1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100
Таблица получилась не слишком аккуратной. Заменим одну строку кода.
System.out.printf("%4d", multiplyTable[i][j]);
1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100
Таблица стала компактнее, кроме того числа выравнены по последней цифре и визуально смотрится гораздо красивее.
Выражение %4d является шаблоном, который выделил четыре места под выводимое число. Но есть и другие способы форматирования строки.
В предыдущем примере d означает вывод десятичного целого числа, а 4 — означает то, что если количество знаков в числе меньше, чем 4, то оно будет спереди дополнено пробелами на недостающее количество знаков. % — специальный символ, обозначающий начало инструкции форматирования.
Усложним пример, написав страшный код.
System.out.printf("%5d%n%5d%n%5d%n%5d%n%5d", 55555, 4444, 333, 22, 1);
55555 4444 333 22 1
Выражение %5d уже знакомо — мы форматируем имеющиеся числа, выделяя по пять мест. Выражение %n означает перевод строки. Тем самым мы получили лесенку. Можно догадаться, что после первого параметра идут данные из массива, которые подставляются вместо выражения. Перевернём строку.
System.out.printf("%5d%n%5d%n%5d%n%5d%n%5d", 1, 22, 333, 4444, 55555); 1 22 333 4444 55555
Рассмотрим пример с числом с плавающей точкой.
System.out.printf("%1$+010.5f", Math.PI); +003.14159
- 1$ — данный формат применяется к первому аргументу, который находится после строки форматирования. В данном примере это было указывать не обязательно
- +0 — недостающие (до 10-ти) символы будут заполнены нулями, перед числом будет указан знак (+)
- 10 — всего выведенное число будет иметь ширину в 10 символов
- .5 — выведенное число будет содержать 5 знаков после запятой
- f — выводим число с плавающей точкой. По умолчанию шесть символов после запятой
На практике часто встречается вариант, когда в строку вставляются несколько выражений. Например, так.
int i = 5; double root; root = Math.sqrt(i); System.out.printf("Корень числа %d равен %.3f", i, root); // Выводится Корень числа 5 равен 2.236
Программа встречает первую инструкцию и применяет к первому элементу массива (i), затем вторая инструкция применяется ко второму элементу root.
Очень большое целое число можно разбить на разряды. Тут есть одна особенность. Во многих странах используют разные способы разбивки. Например, в России считается стандартом разбивка при помощи запятой, а во Франции через пробелы. По умолчанию используется локаль системы. Можно переопределить локаль, чтобы получить нужный результат.
System.out.printf(Locale.FRANCE,"%,d", 1000000000); // Выводится 1 000 000 000
Мы выводили числа с пробелами спереди. Пробелы можно заменить на нули.
System.out.printf("%3d", 3); // три места под число, дополняются пробелами System.out.println(); System.out.printf("%03d", 3); // три места под число, дополняются нулями // Выводится 3 003
Можно добавить плюс (уже использовали) или выравнивать число пробелами по левой стороне.
System.out.printf("%+3d", 3); // выводим плюсик и три места под число System.out.println(); System.out.printf("%-3d", 3); // три места под число, пробелы справа после числа System.out.print(1); // Результат +3 3 1
Кроме чисел можно форматировать строки. Используется символ s.
System.out.printf("А у нас сегодня %s родила вчера %s", "кошка", "котят"); // Результат А у нас сегодня кошка родила вчера котят
«%10s%n» — если строка содержит менее 10 символов, то будет дополнена пробелами слева.
«%-10s%n» — если строка менее 10 символов, то будет дополнена пробелами справа на недостающее количество символов.
Выводим три первых символа.
System.out.printf("%.3s", "Котелок");
Кстати, эти же правила форматирования используются в методе String.format(). Там можно найти другие символы форматирования для дат, шестнадцатеричных систем, верхнего регистра и т.д.
Методы String.format() и printf() в Java
В программировании на Java вы часто сталкиваетесь с кодом System.out.printf(..). На самом деле метод printf(..) определен как в классе PrintStream, так и в классе PrintWriter, их использование аналогично, printf означает «Print + Format».
printf methods
// Definition of the printf methods in the PrintWriter class: public PrintStream printf(Locale l, String format, Object. args) public PrintStream printf(String format, Object. args) // Definition of the printf methods in PrintWriter class: public PrintWriter printf(Locale l, String format, Object. args) public PrintWriter format(String format, Object. args)
- Руководство Java PrintStream
- Руководство Java PrintWriter
System.out.printf(..) — это особый случай, используемый для записи форматированного текста на экран Console, где System.out по сути является объектом типа PrintStream.
System class
package java.lang; public final class System
Прежде чем мы начнем, давайте рассмотрим простой пример:
Printf_ex1.java
package org.o7planning.printf.ex; public class Printf_ex1 < public static void main(String[] args) < String firstName = "James"; String lastName = "Smith"; int age = 20; System.out.printf("My name is %s %s, I'm %d years old.", firstName, lastName, age); >>
My name is James Smith, I'm 20 years old.
Форматирование строк и чисел в Java
Форматирование чисел и строк в Java можно осуществить и вывести с помощью команды printf. Команда printf понимает последовательность символов, известную как спецификация формата.

Затем printf берет строку текста и форматирует ее на основе переданной спецификации формата. Предположим, что в качестве примера мы хотим, чтоб в окне «Вывод» текст отображался аккуратно, например: Первый столбец выровнен по левому краю, а второй — выровнен по правому. Код для заголовков Exam_Name и Exam_Grade был таким:
String heading1 ="Exam_Name"; String heading2 = "Exam_Grade"; System.out.printf("%-15s %15s %n", heading1, heading2);
Чтобы получить выровненный по левому краю столбец, вам нужен символ процента, символ минуса, количество символов, а затем буква «s» (строчные буквы). Таким образом, «%-15s» означает пятнадцать символов, выровненных по левому краю. Чтобы получить выровненный по правому краю столбец, используется та же последовательность символов, за исключением знака минус. Для получения новой строки используется %n. Обратите внимание, что символы окружены двойными кавычками. После запятой вы набираете текст, который хотите отформатировать. Первая запятая в приведенном выше коде отделяет спецификацию формата от форматируемого текста. Вот несколько таблиц различных вариантов.
Форматирование строк Java
| %s | Форматируется строка с таким количеством символов, которое необходимо |
| %15s | Форматируется строка с указанным количеством символов и выравнивание по правому краю |
| %-15s | Форматируется строка с указанным количеством символов и выравнивание по левому краю |
Если вы хотите отформатировать числа, вы можете использовать символ «d» или, для чисел с плавающей запятой, символ «f».
Форматирование целых чисел Java
| %d | Форматируется строка с таким количеством цифр, которое необходимо |
| %4d | Форматируется строка с указанным количеством целых чисел. Заполнит пробелы слева, если недостаточно целых чисел |
| %04d | Форматируется строка с указанным количеством целых чисел. Заполнит нулями слева, если недостаточно целых чисел |
Форматирование чисел с плавающей точкой Java
| %f | Форматируется строка с таким количеством цифр, которое необходимо. Всегда даст вам 6 знаков после запятой |
| %.2f | Форматируется строка с таким количеством чисел, которое необходимо. Даст 2 знака после запятой |
| %10.2f | Форматируется 2 знаков после запятой, но вся строка займет 10 символов. Если чисел недостаточно, пробелы дополнятся слева от чисел |
Вот несколько примеров кода форматирования строк, целых чисел и чисел с плавающей точкой в Java. Попробуйте их сами.
System.out.printf("%s %d %n", "Общее:", 34573);
Текст «Общее:» будет отформатирован как строка (% s), а цифры 34573 будут отформатированы как цифры (% d):
System.out.printf("%s %10d %n", "Общее:", 34573);
То же, что и выше, только цифры занимают 10 мест с пробелами слева в качестве отступов:
System.out.printf("%-10d %10d %n", 22334, 34573);
Две числа. Первое выровнено по левому краю; второе — по правому:
System.out.printf("%010d %10d %n", 22334, 34573);
Снова два числа. Первое дополнено нулями спереди. Второе — выравнено по правому краю, но пробелы используются как отступы слева вместо нулей:
System.out.printf("%f %n", 345.73);
Отформатировано число с плавающей запятой и добавлены новые строковые символы. Число с плавающей запятой будет иметь 6 знаков после запятой:
System.out.printf("%.2f %n", 34.573);
То же, что и выше, но форматируется только до двух знаков после запятой: Наконец, вот снова та таблица, которая была вначале этого урока по форматированию в Java: И вот код для вышеупомянутого форматированного вывода:
package stringformatting; public class StringFormat public static void main(String[] args) String heading1 ="Exam_Name"; String heading2 = "Exam_Grade"; String divider = "-----------------------------------"; String course1 = "Java"; String course2 = "PHP"; String course3 = "VB NET"; String grade1 = "5"; String grade2 = "4"; String grade3 = "3"; System.out.println(""); System.out.printf("%-15s %15s %n", heading1, heading2); System.out.println(divider); System.out.printf("%-15s %10s %n", course1, grade1); System.out.printf("%-15s %10s %n", course2, grade2); System.out.printf("%-15s %10s %n", course3, grade3); System.out.println(divider); System.out.println(""); > >
Поиграйте с форматированием, это пойдет на пользу для закрепления материала. Если вы получаете сообщения об ошибках, возможно, вы перепутали форматирование «s» с форматированием «d»! В следующем разделе мы продолжим и рассмотрим методы Java.