Форматируем и выводим числа в 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– специальный символ, который указывает на тот, как должен быть отформатирован аргумент.

Форматируем и выводим числа в java

Метод 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):

Форматируем и выводим числа в java
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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *