Как напечатать дату в произвольном формате в Java 8? - PullRequest
0 голосов
/ 14 января 2019

Я хотел бы создать отформатированный график, как показано ниже:

enter image description here

Количество символов в каждом из полей равно 4, 12, 17, 40 и 4 соответственно. Поля также выровнены по левому краю.

Используя код, который я разместил ниже, мой результат выглядит следующим образом:

Фрагмент кода для форматирования:

for (Tasks examined : shortList) {
  String yesNo = examined.isDone() == true ? "yes" : "no";
  System.out.printf("%1$-4s" + "| " + "%2$tY.%<tm.%<-12td." 
     + "| " + "%3$-17s" + "| " + "%4$-40s" + "| " + yesNo + "\n"
               , examined.getNumber(), examined.getDeadline()
               , importanceLevel, examined.getName())
}

Типы переменных:

examined.getNumber() //integer
examined.getDeadline() //DateTime
importanceLevel //String
examined.getName() //String

Я изучал класс Formatter в JavaDocs здесь . Но я не смог решить проблему.

Основной проблемой здесь является точка (. ) в конце поля «дата». В нем не должно быть всего этого пробела между датой и точкой остановки.

Я хотел организовать ширину элемента 'date' с флагом -12, но остальное было вырезано как последняя точка выше.

Как это можно решить?

1 Ответ

0 голосов
/ 14 января 2019

Это может решить вашу проблему, если я правильно понял ваши требования:

int index = 1;
                                   //yyyy, MM, dd, hh, min
LocalDateTime ldt = LocalDateTime.of(2018, 12, 31, 12, 10);
                               //specify custom pattern here
String date = DateTimeFormatter.ofPattern("yyyy.MM.dd.").format(ldt);
String importance = "kozepesen fontos";
String name = "egyik feladat";
String yesNo = "yes";
String formatter = "%-4d| %-12s| %-17s| %-40s| %-5s%n";
//now use System.out.format() to print with pattern specified in 'formatter'
System.out.format(formatter, index, date, importance, name, yesNo);

выход : 1 | 2018.12.31. | kozepesen fontos | egyik feladat | yes

  1. В приведенном выше решении мы неизбежно преобразуем дату в строку. То есть мы можем указать пользовательский шаблон для отображения даты. Сначала мы создаем экземпляр DateTimeFormatter() с желаемым шаблоном. Шаблон указывается с помощью метода DateTimeFormatter ofPattern(String pattern). Затем, чтобы получить String в качестве возвращаемого типа, мы снова используем метод format(TemporalAccessor temporal) из DateTimeFormatter. Мы можем использовать экземпляр DateTime в качестве параметра TemporalAccessor в format(), как показано в коде выше.

  2. Так как же работает String formatter = "%-4d| %-12s| %-17s| %-40s| %5s%n"? Я использовал синтаксис для документации Formatter для Java 8.

    - -> Результат будет выровнен по левому краю .

    % -> Результат - литерал .

    n -> Результатом является разделитель строки для конкретной платформы .

    d -> Результат форматируется как десятичное целое число .

    s -> Если аргумент arg равен null, то результат равен нулю. Если arg implements Formattable, то вызывается arg.formatTo(). В противном случае результат получается путем вызова arg.toString().

    Наконец, числа, которые я использовал, задают количество символов, разрешенное для каждого поля.

  3. Затем, наконец, мы вызываем System.out.format вместо printf(), где определяющая формат строка является параметром first , и все остальные переменные для форматирования должны введите в правильном порядке (в том же порядке, что и в строке , указывающей формат ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...