#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).