Форматируем и выводим числа в java
Большинство новичков, которые видели документацию по форматированию строк на Java в официальной справке, считают ее сложной. Мы постараемся дать более понятное руководство на эту тему.
Наиболее популярный способ форматирования — String.format().
Stringoutput = String.format(«%s = %d», «joe», 35)
System.out.printf(«Mynameis: %s%n», «joe»);
Для форматированного вывода на консоль используются: System.errPrintStreams и printf() или метод format() System.out.
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 (Stringformat, Object… args) форматирует строку по умолчанию. Метод format (localelocale, Stringformat, Object… args) форматирует строку с учетом указанного стандарта.
Создайте модуль форматирования, после чего свяжите его со StringBuilder. Выходные данные, отформатированные с применением метода format(), добавятся к StringBuilder.
StringBuildersbuf = newStringBuilder();
Formatterfmt = newFormatter(sbuf);
fmt.format(«PI = %f%n», Math.PI);
System.out.print(sbuf.toString());
Спецификаторы формата Java
Приведем краткий справочник по всем спецификатором, поддерживаемым Java.
Тип | Спецификатор | Вывод |
floatingpoint (exceptBigDecimal) | %a | Шестнадцатеричный вывод числа с плавающей запятой |
Anytype | %b | “true” если не 0, “false” если 0 |
character | %c | Юникод |
integer (incl. byte, short, int, long, bigint) | %d | Десятичное целое |
floatingpoint | %e | десятичное число в научной записи |
floatingpoint | %f | десятичное число |
floatingpoint | %g | десятичное число, возможно, в научных обозначениях в зависимости от точности и значения. |
anytype | %h | Шестнадцатеричная строка значения из метода hashCode (). |
none | %n | Специфичный для платформы разделитель строк. |
integer (incl. byte, short, int, long, bigint) | %o | Восьмеричное число |
anytype | %s | Строковое значение |
Date/Time (incl. long, Calendar, DateandTemporalAccessor) | %t | % t — это префикс для преобразования даты / времени. |
integer (incl. byte, short, int, long, bigint) | %x | Шестнадцатеричная строка. |
Форматирование целых чисел
Посредством спецификатора формата %d можно применять аргументы всех целочисленных типов, в том числе short, int,byte,long и BigInteger.
Форматирование по умолчанию:
String.format(«%d», 93); // prints 93
Указание ширины:
String.format(«|%20d|», 93); // prints: | 93|
Выравнивание по левому краю в границах указанной ширины:
String.format(«|%-20d|», 93); // prints: |93 |
Вывести положительные числа со знаком «+»:
(Отрицательные числа содержат «-»):
String.format(«|%+20d|’, 93); // prints: | +93|
Пробел перед положительными числами.
String.format(«|% d|», 93); // prints: | 93| String.format(«|% d|», -36); // prints: |-36|
Поместить отрицательные числа в круглые скобки («()») и пропустить «-»:
String.format(«|%(d|», -36); // prints: |(36)|
Восьмеричный вывод:
String.format(«|%o|»), 93); // prints: 135
Шестнадцатеричный вывод:
String.format(«|%x|», 93); // prints: 5d
Альтернатива для восьмеричного и шестнадцатеричного вывода:
Печатает восьмеричные числа с начальным «0» и шестнадцатеричные числа с начальным «0x».
String.format(«|%#o|», 93);
// prints: 0135
String.format(«|%#x|», 93);
// prints: 0x5d
String.format(«|%#X|», 93);
// prints: 0X5D
Форматирование строк и символов
Форматирование по умолчанию:
Печатает всю строку.
String.format(«|%s|», «HelloWorld»); // prints: «HelloWorld»
С указанием длины поля:
String.format(«|%30s|», «HelloWorld»); // prints: | HelloWorld|
Выравнивание по левому краю:
String.format(«|%-30s|», «HelloWorld»); // prints: |HelloWorld |
Выводит максимального количества символов:
String.format(«|%.5s|», «HelloWorld»); // prints: |Hello|
Указывает ширину поля и максимальное кол-во символов:
String.format(«|%30.5s|», «HelloWorld»); | Hello|
Примеры
Пример кода, форматирующего строку, целое число и число с плавающей запятой. Точность до двух чисел после десятичной точки (.2f):
Stringtitle = «EffectiveJava»;
floatprice = 33.953f;
System.out.format(«%s is a greatbook. Itissoldat %.2f USD today.%n», title, price);
Вывод:
EffectiveJavais a greatbook. Itissoldat 33.95 USD today.
Пример использования флага ‘-‘ для выравнивания по левому краю строк с шириной 30 символов:
List<string>listBook = Arrays.asList(
«HeadFirstJava»,
«EffectiveJava»,
«ThePassionateProgrammer»,
«HeadFirstDesignPatterns»
);
for(Stringbook :listBook){
System.out.format(«%-30s — InStock%n», book);
}</string>
Пример печати чисел как в десятичном формате (%d), так и в шестнадцатеричном формате (%x and %#x):
System.out.format(«Minvalueof a byte: %d (%1$#x)%n», Byte.MIN_VALUE);
System.out.format(«Maxvalueof a byte: %d (%1$#x)%n», Byte.MAX_VALUE);
System.out.format(«Minvalueofanint: %d (%1$x)%n», Integer.MIN_VALUE);
System.out.format(«Maxvalueofanint: %d (%1$x)%n», Integer.MAX_VALUE);
Внимание! Существует два спецификатора формата, но лишь один аргумент, поэтому мы применяем индекс аргумента 1$, дабы указать позицию аргумента для спецификатора.
Результат:
Minvalueof a byte: -128 (0x80)
Maxvalueof a byte: 127 (0x7f)
Minvalueofanint: -2147483648 (80000000)
Maxvalueofanint: 2147483647 (7fffffff)
Приведенный ниже код использует префикс t с преобразованиями даты и времени (T, F и D) для записи отформатированных строк текущего времени и даты в файл:
PrintWriterwriter = newPrintWriter(newFile(«datetime.txt»));
writer.format(«Nowis %tT %n», newDate());
writer.format(«Todayis %tF %n», newDate());
writer.format(«Todayis %tD %n», newDate());
writer.close();
На выходе получаем файл (datetime.txt) со следующим содержимым:
Nowis 23:25:11
Todayis 2016-12-14
Todayis 12/14/16
Следующий код форматирует объект Date в строку, применяя полное локальное имя дня недели (tA), имя месяца (tB), день месяца (td) и год из четырех цифр (tY):
String.format() возвращает отформатированную строку, укажите <, дабы показать, что данный спецификатор использует тот же аргумент, что и предыдущий. Вывод: TodayisWednesdayDecember 14, 2016
Далее форматируем вывод, чтобы он выглядел как столбцы:
Stringspecifiers = «%-30s %-20s %-5.2f%n»;
System.out.format(specifiers, «HeadFirstJava», «KathySierra», 23.99f);
System.out.format(specifiers, «ThinkinginJava», «BruceEckel», 25.69f);
System.out.format(specifiers, «EffectiveJava», «JoshuaBloch», 27.88f);
System.out.format(specifiers, «ThePassionateProgrammer», «ChadFowler», 41.99f);
System.out.format(specifiers, «CodeComplete», «SteveMcConnell», 38.42f);
Теперь самое сложное – произведем форматирование чисел в Java с добавлением нуля для чисел меньше 5 символов (%05d); заключим в скобки отрицательные числа (%(d) и включим знак для чисел (% + d):
System.out.format(«%05d %n», 12);
System.out.format(«%05d %n», 2016);
System.out.format(«%05d %n», 365);
System.out.format(«%05d %n», 19001800);
System.out.format(«%(d %n», -1234);
System.out.format(«%+d %n», 567);
System.out.format(«%+d %n», -891);
Получим:
00012
02016
00365
19001800
(1234)
+567
-891