Java printf: Как неявно определять / объявлять пустые пространства посредством преобразования? - PullRequest
0 голосов
/ 20 июня 2020

В Java со следующим

printf("%-5s Hello %s %n", "", "There!")

Он печатает

     Hello There! 

Где существует 5 пустых мест, расположенных слева.

Пока это работает как ожидается, но ...

Я хочу знать, возможно ли: как избежать объявления "" и изменить %-5s на то, что printf может интерпретировать, что представляет собой пустое пространство?

Я имею в виду: например, %-5e, где e предполагается, что это пустой символ, и поэтому больше нет необходимости явно объявлять "".

Что-то похожее на %n, где не требуется аргумент через printf. Ясно, что %s требует аргумента, в данном случае "", но мне интересно, может ли мой запрос быть выполнен.

Я прочитал Formatter javado c для этой необходимой функции и, кажется, не существует.

Я уже проводил исследование SO, и некоторые предлагаемые решения используют + в printf, но, честно говоря, это снижает читабельность

Поэтому цель (отформатирована для лучшего представления):

From: printf("%-5s Hello %s %n", "", "There!")
To:   printf("%-5e Hello %s %n",     "There!") // %-5e is the functionality I need or looking for

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Если вы используете Java 12 или выше, и все, что вам нужно, это настроить отступ результирующей строки, вы можете использовать String#indent. Используя ваш пример для вставки 5 пробелов в начале:

System.out.printf("Hello %s %n".indent(5),  "There!");

Поскольку indent также нормализует символы завершения строки, вы также можете удалить %n

System.out.printf("Hello %s ".indent(1),  "There!");
System.out.printf("Hello %s ".indent(2),  "There!");
System.out.printf("Hello %s ".indent(3),  "There!");
System.out.printf("Hello %s ".indent(4),  "There!");

, чтобы получить что-то вроде :

 Hello There! 
  Hello There! 
   Hello There! 
    Hello There! 
0 голосов
/ 20 июня 2020

Вы должны определить новый printf следующим образом.

static Pattern EMPTY_CONVERSION = Pattern.compile("%-?(\\d+)e");

public static String printf(String format, Object... args) {
    StringBuffer sb = new StringBuffer();
    Matcher m = EMPTY_CONVERSION.matcher(format);
    while (m.find())
        m.appendReplacement(sb, " ".repeat(Integer.parseInt(m.group(1))));
    m.appendTail(sb);
    return String.format(sb.toString(), args);
}

Если вы используете Java 8, создайте свой собственный repeat.

e зарезервировано для плавающих точки преобразования, поэтому вы можете изменить его.

...