Форматирование строки в java с максимальной шириной и закрывающей скобкой в ​​конце слова

Я хочу получить формат ниже

abc 12 [hello-wo]       this is message1
abc 12 [hello-world]    this is message2
abc 10 [hello-wor]      this is message2  

Я пробовал использовать

String format1 = "%s %d [%s-%s] %s\n";
String format2 = "%s %d [%s-%-20s] %s\n";
    String a = String.format(format1,"abc","12",hello,"wo","this is message1");
    System.out.print(a);

Я привел, как показано ниже, используя два формата (format1 и format2)

format1

abc 12 [hello-wda] this is message1
abc 12 [hello-world] this is message2
abc 10 [hello-wor] this is message2

format2

abc 12 [hello-wo                  ] this is message1
abc 12 [hello-world               ] this is message2
abc 12 [hello-wor                 ] this is message1

Я хочу выровнять последнюю часть параметра в том же вертикальном положении, а закрывающие квадратные скобки должны находиться в конце 4-го параметра без пробелов.

В общем, вам нужен такой вывод, как [hello- world]; со словом мира рядом с закрывающей скобкой, несмотря на ее длину?

Romain VDK 11.04.2018 12:41
1
1
115
2

Ответы 2

То, что вы описываете, меняет аргумент. Это не то, что обычно делают форматеры (если не с числами и датами, то есть довольно специфическими вещами).

Я думаю, вы не можете делать то, что хотите, но вы можете обойти это, используя шаблон и преобразовывая свои аргументы вручную, например:

Шаблон:

String PATTERN = "%s %d [%s-%-21s %s\n"; // notice that I've removed the closing bracket.
                                         // See below

Применяя аргументы:

String arg = "world";
arg = arg.trim();
arg = arg.substring(0, Math.min(arg.length(), 20));
String.format(PATTERN, "abc", "12", "hello",
    /*Attention here: changing next argument by appending close bracket */
    arg + "]",
    "this is the message");

Вот трюк, как вы можете решить вашу проблему:

public void formatString(String hello) {
    String format1 = "%s %s %s\n";
    String firstPart = String.format("%s %d [%s-%s]", "abc", 12, hello, "wo");
    String a = String.format(
            format1, firstPart, 
            String.format("%0" + Math.abs(30 - firstPart.length()) + "d", 0).replace("0", " "), 
            "this is message1");
    System.out.print(a);
}

Прецедент :

formatString("hello-wda");
formatString("hello-world");
formatString("hello-wor");

Выходы

abc 12 [hello-wda-wo]           this is message1
abc 12 [hello-world-wo]         this is message1
abc 12 [hello-wor-wo]           this is message1

Хитрость в том, чтобы использовать два формата: первый для создания первой части, нам нужна эта часть для расчета количества пространства, необходимого для равновесия, второй формат для объединения первой части + пробелы между первой и второй частью + вторая часть.

Я использовал 30 как значение по умолчанию, вы можете изменить его по своему усмотрению.

Другие вопросы по теме