Почему `%4.` добавить пробел к моему номеру?

#java #string #formatting #format #string-formatting

#java #строка #форматирование #формат #форматирование строки

Вопрос:

У меня есть этот код:

 private String padWithZeroRightToPeriod(String serverFormat, float unformattedNumber, int index) {
    int nDigits = getNumberOfDigitsAfterPeriod(serverFormat);
    String floatingFormat = "%4."   nDigits   "f";
    String formattedPrice = String.format(floatingFormat, unformattedNumber);
  

Почему при вызове с unformattedNumber 846 помощью being результат " 846" (пробел, а затем три цифры)?

Что это %4. значит?

Комментарии:

1. Вы смотрели на Javadocs? Вы пробовали какие-либо другие входные данные, чтобы понять поведение?

2. не удалось выполнить поиск в документах java. какой термин использовать? форматирование строк не помогло

3. Что значит «не помогло»? Это очень хорошо документировано . %[argument_index$][flags][width][.precision]conversion .

4. @BoristheSpider это означает, что %[argument_index$][flags][width] мне это непонятно. Я могу попробовать несколько примеров, но я хочу понять поведение, а не угадывать его.

5. нет, но его пример сделал.

Ответ №1:

Документы для String.format отсылают вас к этой документации по строкам формата, в которой говорится:

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

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

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

Необязательные флаги — это набор символов, которые изменяют формат вывода. Набор допустимых флагов зависит от преобразования.

Необязательная ширина — это положительное десятичное целое число, указывающее минимальное количество символов, которые должны быть записаны в выходные данные.

Необязательная точность — это неотрицательное десятичное целое число, обычно используемое для ограничения количества символов. Конкретное поведение зависит от преобразования.

Требуемое преобразование — это символ, указывающий, как должен быть отформатирован аргумент. Набор допустимых преобразований для данного аргумента зависит от типа данных аргумента.

Из вашего примера выводится, что getNumberOfDigitsAfterPeriod это повторяется 0 , поэтому ваша строка формата %4.0f . So:

  • У него нет индекса аргумента ( $ после него нет 4 )
  • У него есть width ( 4 )
  • У него есть precision ( 0 )
  • И, конечно же, у него есть conversion ( f )

Таким образом, выводится 846 " 846" , поскольку ширина равна 4. Рассматриваемая ширина — это общее количество выводимых символов. Вот другой пример: живая копия

 public class Example {

    public static void main(String args[]) {
        System.out.println(String.format("%8.2f", 846.0));
        System.out.println(String.format("%8.2f", 42.4));
    }
}
  

Вывод:

  846.00
   42.40

Обратите внимание, что длина каждого из них составляет восемь символов.

Комментарии:

1. It has a width (4) . имеет ли 42.4 ширину 4 ?

2. @user1065869: Да, ширина — это «минимальное количество символов, которые должны быть записаны в выходные данные» (например, в целом). Но, учитывая ваш пример вывода " 846" ), по-видимому getNumberOfDigitsAfterPeriod , возвращается 0 . String.format("%4.0f", 42.4) возвращает " 42" (два пробела, за которыми следует 42).