Руководство по java.util.Formatter
1. Обзор
В этой статье мы обсудим струна форматирование на Java с использованием java.util.Formatter класса, который обеспечивает поддержку обоснования макета и выравнивания.
2. Как использовать Formatter
Помни о printf? Форматирование Струнные на Java чувствует себя очень похоже.
тем формат () метод форматер подвергается воздействию статического метода от струна класс. Этот метод принимает шаблон струна и список аргументов для заполнения шаблона:
String greetings = String.format( "Hello Folks, welcome to %s !", "Baeldung");
В результате Струнные есть:
"Hello Folks, welcome to Baeldung !"
Шаблон – это Струнные который содержит некоторый статический текст и один или несколько форматных статических элементов, которые указывают, какой аргумент должен быть помещен …
В этом случае есть единый формат, указанный %s , который заменяется соответствующим аргументом.
3. Форматные меры
3.1. Общий синтаксис
Синтаксис форматных оптимизаторов для Генерал, Характер, и числовой тип:
%[argument_index$][flags][width][.precision]conversion
Описатели argument_index, флаг, ширина и точность являются необязательными.
- argument_index часть является интегратором i – что свидетельствует о том, что ith аргумент из списка аргументов следует использовать здесь
- Флаги это набор символов, используемых для изменения формата вывода
- Ширина является положительным integer, который указывает минимальное количество символов, которые будут написаны на выходе
- точность является integer обычно используется для ограничения числа символов, чье конкретное поведение зависит от преобразования
- является обязательной частью. Это символ, указывающий, как аргумент должен быть отформатирован. Набор действительных конверсий для данного аргумента зависит от типа данных аргумента
В нашем приведеном выше примере, если мы хотим прямо указать число аргументов, мы можем написать его с помощью 1 $ и 2$ аргумент индексов.
Оба они являются первым и вторым аргументом соответственно:
String greetings = String.format( "Hello %2$s, welcome to %1$s !", "Baeldung", "Folks");
3.2. Для представления даты/времени
%[argument_index$][flags][width]conversion
Снова argument_index, флаги и Ширина являются необязательными.
Давайте возьмем пример, чтобы понять это:
@Test public void whenFormatSpecifierForCalendar_thenGotExpected() { Calendar c = new GregorianCalendar(2017, 11, 10); String s = String.format( "The date is: %tm %1$te,%1$tY", c); assertEquals("The date is: 12 10,2017", s); }
Здесь, для каждого формата уядер, первый аргумент будет использоваться, следовательно, 1$ . Здесь, если мы пропустим argument_index для 2-го и 3-го формата, он пытается найти 3 аргументы, но мы должны использовать тот же аргумент для всех 3 форматов.
Так что, это нормально, если мы не указать аргумент _index для первого, но мы должны указать его для двух других.
тем флаг здесь состоит из двух символов. Где первый персонаж всегда ‘t’ или ‘T’ . Второй символ зависит от того, какая часть календарь должна быть отображена.
В нашем примере первые форматные прояснители Тм , указывает месяц, отформатированный как две цифры, те указывает день месяца и tY отформатирован год как четыре цифры.
3.3. Форматные прояснители без аргументов
%[flags][width]conversion
Необязательно Флаги и Ширина такие же, как определено в вышеуказанных разделах.
Требуемое превращение струна с указанием содержимого, которое будет вставлено в выходные данные. В настоящее время только ‘%’ и newline ‘n’ могут быть напечатаны с помощью этого:
@Test public void whenNoArguments_thenExpected() { String s = String.format("John scored 90%% in Fall semester"); assertEquals("John scored 90% in Fall semester", s); }
Внутри формат () , если мы хотим распечатать ‘%’ – мы должны избежать этого с помощью ‘%%’ .
4. Преобразования
Давайте теперь копаться в каждой детали формата Specifier синтаксис, начиная с превращение . Обратите внимание, что вы можете найти все детали в форматер Джавадоки .
Как мы заметили в вышеуказанных примерах, превращение часть требуется во всех форматах, и ее можно разделить на несколько категорий.
Давайте посмотрим на каждый из них, взяв примеры.
4.1. Генерал
Используется для любого типа аргументов. Общие преобразования:
- ‘b’ или ‘B’ – для булев Значения
- ‘h’ или ‘H’ – для Хэш-код
- ‘s’ или ‘S’ – для Струнные , если нулевой , он печатает “нулевой”, arg.toString()
Теперь мы постараемся отобразить булев и струна значения, используя соответствующие преобразования:
@Test public void givenString_whenGeneralConversion_thenConvertedString() { String s = String.format("The correct answer is %s", false); assertEquals("The correct answer is false", s); s = String.format("The correct answer is %b", null); assertEquals("The correct answer is false", s); s = String.format("The correct answer is %B", true); assertEquals("The correct answer is TRUE", s); }
4.2. Характер
Используется для основных типов, представляющих символы Unicode: char, Характер, byte, Byte, короткий, и Короткие . Это преобразование также может быть использовано для типов int и Интегер когда Character.isValidCodePoint (int) возвращает истинное для них.
Она может быть написана как ‘c’ или ‘C’ на основе дела, которого мы хотим.
Давайте попробуем напечатать некоторые символы:
@Test public void givenString_whenCharConversion_thenConvertedString() { String s = String.format("The correct answer is %c", 'a'); assertEquals("The correct answer is a", s); s = String.format("The correct answer is %c", null); assertEquals("The correct answer is null", s); s = String.format("The correct answer is %C", 'b'); assertEquals("The correct answer is B", s); s = String.format("The valid unicode character: %c", 0x0400); assertTrue(Character.isValidCodePoint(0x0400)); assertEquals("The valid unicode character: Ѐ", s); }
Возьмем еще один пример недействительной точки кода:
@Test(expected = IllegalFormatCodePointException.class) public void whenIllegalCodePointForConversion_thenError() { String s = String.format("The valid unicode character: %c", 0x11FFFF); assertFalse(Character.isValidCodePoint(0x11FFFF)); assertEquals("The valid unicode character: Ā", s); }
4.3. Нумерический – интеграл
Они используются для java интегральных типов: byte, Byte, короткий, короткий, int и Интегратор, длинный, длинный, и БигИнтегер . В этой категории три преобразования:
- ‘d’ – для десятичного числа
- ‘o’ – для окталового числа
- ‘X’ или ‘x’ – для шестисемейного числа
Давайте попробуем распечатать каждый из них:
@Test public void whenNumericIntegralConversion_thenConvertedString() { String s = String.format("The number 25 in decimal = %d", 25); assertEquals("The number 25 in decimal = 25", s); s = String.format("The number 25 in octal = %o", 25); assertEquals("The number 25 in octal = 31", s); s = String.format("The number 25 in hexadecimal = %x", 25); assertEquals("The number 25 in hexadecimal = 19", s); }
4.4. Нумерический – Плавающая точка
Используется для типов плавающих тоных тоов Java: поплавок, поплавок, двойной, двойной, и БигДекималь
- ‘e’ или ‘E’ – отформатирован как десятичное число в компьютеризированной научной нотации
- ‘f’ – отформатировано как десятичное число
- ‘g’ или ‘G’ – на основе точного значения после округления, это преобразование форматов в компьютеризированные научные нотации или десятичного формата
Попробуем распечатать плавающие точечные номера:
@Test public void whenNumericFloatingConversion_thenConvertedString() { String s = String.format( "The computerized scientific format of 10000.00 " + "= %e", 10000.00); assertEquals( "The computerized scientific format of 10000.00 = 1.000000e+04", s); String s2 = String.format("The decimal format of 10.019 = %f", 10.019); assertEquals("The decimal format of 10.019 = 10.019000", s2); }
4.5. Другие преобразования
- Дата/время – для типов Java, которые способны кодировать дату или время: длинный, длинный, календарь, Дата и ВременныйДоступ. Для этого нам нужно использовать приставку ‘t’ или ‘T’ , как мы видели ранее
- процент – печатает буквальное ‘%’ (‘u0025’)
- Линейный сепаратор – печатает сепаратор линии, специфичный для платформы
Рассмотрим простой пример:
@Test public void whenLineSeparatorConversion_thenConvertedString() { String s = String.format("First Line %nSecond Line"); assertEquals("First Line \n" + "Second Line", s); }
5. Флаги
Флаги, как правило, используются для форматирования вывода. В то время как в случае даты и времени, они используются для того, чтобы указать, какая часть даты должна быть отображена, как мы видели в примере раздела 4.
Имеется ряд флагов, список которых можно найти в документации.
Давайте посмотрим пример флага, чтобы понять его использование. ‘-‘ используется для форматирования вывода как слева оправдано:
@Test public void whenSpecifyFlag_thenGotFormattedString() { String s = String.format("Without left justified flag: %5d", 25); assertEquals("Without left justified flag: 25", s); s = String.format("With left justified flag: %-5d", 25); assertEquals("With left justified flag: 25 ", s); }
6. Точность
Для общих конверсий точность – это максимальное количество символов, которые должны быть записаны на выходе . Принимая во время, f или плавающей точкой преобразования точность количество цифр после точки радикса.
Первое утверждение является примером точности с плавающими точечными числами, а второе — с общими преобразованиями:
@Test public void whenSpecifyPrecision_thenGotExpected() { String s = String.format( "Output of 25.09878 with Precision 2: %.2f", 25.09878); assertEquals("Output of 25.09878 with Precision 2: 25.10", s); String s2 = String.format( "Output of general conversion type with Precision 2: %.2b", true); assertEquals("Output of general conversion type with Precision 2: tr", s2); }
7. Индекс аргументов
Как упоминалось ранее, argument_index является интегратором, указывающим на позицию аргумента в списке аргументов . 1$ указывает на первый аргумент, 2$ второй аргумент, и так далее.
Кроме того, есть еще один способ со ссылкой на аргументы по позиции, используя ‘<‘ (‘u003c’) флаг, что означает, что аргумент из предыдущего формата указан будет повторно использован. Например, эти два заявления будут производить идентичные выходные данные:
@Test public void whenSpecifyArgumentIndex_thenGotExpected() { Calendar c = Calendar.getInstance(); String s = String.format("The date is: %tm %1$te,%1$tY", c); assertEquals("The date is: 12 10,2017", s); s = String.format("The date is: %tm %
8. Другие способы использования Formatter
До сих пор мы видели использование формат () метод Formatter класс. Мы также можем создать Formatter например, и использовать это для вызова формат () метод.
Мы можем создать экземпляр, пройдя в Доступное , ВыходСтрим , Файл или файловое имя . Исходя из этого, отформатированная Струнные хранится в Доступное , ВыходСтрим , Файл соответственно.
Давайте посмотрим пример использования его с помощью Доступно. Мы можем использовать его с другими таким же образом.
8.1. Использование formatter с приложением
Давайте создадим S- tringBuilder например, sb , и создать Formatter используя его. Тогда мы вызовем формат () форматировать Струнные :
@Test public void whenCreateFormatter_thenFormatterWithAppendable() { StringBuilder sb = new StringBuilder(); Formatter formatter = new Formatter(sb); formatter.format("I am writting to a %s Instance.", sb.getClass()); assertEquals( "I am writting to a class java.lang.StringBuilder Instance.", sb.toString()); }
9. Заключение
В этой статье мы увидели возможности форматирования, предоставляемые java.util.Formatter класс. Мы видели различные синтаксисы, которые могут быть использованы для форматирования Струнные и типы конверсий, которые могут быть использованы для различных типов данных.
Как обычно, код для примеров, которые мы видели, можно найти более на Github .