Рубрики
Без рубрики

Руководство по java.util.Formatter

Введение в форматирование строк на Java с помощью java.util.Formatter.

Автор оригинала: Predrag.

Руководство по 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. Генерал

Используется для любого типа аргументов. Общие преобразования:

  1. ‘b’ или ‘B’ – для булев Значения
  2. ‘h’ или ‘H’ – для Хэш-код
  3. ‘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 и Интегратор, длинный, длинный, и БигИнтегер . В этой категории три преобразования:

  1. ‘d’ – для десятичного числа
  2. ‘o’ – для окталового числа
  3. ‘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: поплавок, поплавок, двойной, двойной, и БигДекималь

  1. ‘e’ или ‘E’ отформатирован как десятичное число в компьютеризированной научной нотации
  2. ‘f’ отформатировано как десятичное число
  3. ‘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 .