Что означает% -8.8s при форматировании? И можете ли вы объяснить это форматирование даты% 1 $ tY% 1 $ tm% 1 $ td? - PullRequest
0 голосов
/ 29 января 2020

Я получаю '-' выравнивание по левому краю, но какой период ('.') Находится между?

Я также вижу много # impliedDecimal7SignLastTwoZero. Я прочитал, что «подразумеваемая десятичная дробь просто означает, что существует десятичная точка, подразумеваемая в указанном месте в поле, но фактически не присутствующая в файле», но я не получаю часть «7SignLastTwoZero».

1 Ответ

0 голосов
/ 30 января 2020

% - 8,8 с

Чтобы получить первое понимание, попробуем:

    System.out.format(Locale.ENGLISH, "<%-8.8s>%n", "12345678");
    System.out.format(Locale.ENGLISH, "<%-8.8s>%n", "12345");
    System.out.format(Locale.ENGLISH, "<%-8.8s>%n", "123456789012");

Вывод:

<12345678>
<12345   >
<12345678>

Как вы сказали, %-8s напечатает вывод с выравниванием по левому краю в 8 позициях. За исключением: если вывод длиннее 8 символов, он печатается в любом количестве позиций. Вот где дополнительная .8 имеет значение: она усекает вывод до максимум 8 позиций, как вы видите в третьей строке выше. Это в документации:

Спецификаторы формата для общих, символьных и числовых типов c имеют следующий синтаксис:

  %[argument_index$][flags][width][.precision]conversion

необязательный точность - неотрицательное десятичное целое число, обычно используемое для ограничения количества символов. Специфическое поведение c зависит от преобразования.

Точность

Для общих типов аргументов точность - это максимальное количество символов для записи в вывод.

Вы добавили:

Требования: Уникальный 8 di git школьный идентификатор для сообщения информации учащегося. Alphanumeri c, длина: 8

В этом случае я бы предостерег от %-8.8s. Если по какой-либо ошибке есть 9 или 10 di git ID, никто не обнаружит, потому что форматирование автоматически усекается до 8 цифр. Лучше либо распечатать все цифры, чтобы мы могли их видеть, либо сообщить об ошибке каким-либо образом.

% 1 $ tY% 1 $ tm% 1 $ td

    System.out.format(Locale.ENGLISH, "%1$tY%1$tm%1$td%n",
                        LocalDate.now(ZoneId.of("Europe/Kirov")));

20200129

Эта строка формата печатает год, месяц и день месяца из аргумента 1 в методе форматирования. 1$ означает первый аргумент после строки формата. t означает дату и / или время, а Y, m и d - разные части даты. Таким образом, выходные данные означают год 2020, 29 января. Все это также задокументировано:

Необязательный arguments_index - это десятичное целое число, указывающее позицию аргумента в списке аргументов. На первый аргумент ссылается «1 $», второй на «2 $» и т. Д. c.

Conversion  Argument Category  Description
------------------------------------------------------------------------------
't', 'T'    date/time          Prefix for date and time conversion characters.
                               See Date/Time Conversions. 

Следующее преобразование символы используются для форматирования дат:

    'Y'   Year, formatted as at least four digits with leading zeros as necessary, e.g. 0092 equals 92 CE for the Gregorian calendar.
    'm'   Month, formatted as two digits with leading zeros as necessary, i.e. 01 - 13.
    'd'   Day of month, formatted as two digits with leading zeros as necessary, i.e. 01 - 31

Я привел только 3 соответствующие записи из последней таблицы, есть еще много букв.

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

    System.out.println(LocalDate.now(ZoneId.of("Europe/Kirov"))
            .format(DateTimeFormatter.BASIC_ISO_DATE));

Полночь прошла в Кирове с тех пор, как я впервые опубликовал этот ответ, поэтому теперь выводим нам:

20200130

Документация ссылка

Документация Java строки формата

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