Способ форматирования строк с "?"параметры для полной строки в Java? - PullRequest
10 голосов
/ 02 сентября 2011

Например, я хочу реализовать класс с помощью метода

public class Logger {

    public void info(String message, String[] params) {
    }
}

Если ввод

new Logger().info("Info: param1 is ? , param2 is ?", new  String[] {"a", "b"});

Выход должен быть

Info: param1 is a , param2 is b

Какой самый простой способреализовать это?

Ответы [ 4 ]

23 голосов
/ 02 сентября 2011

Для этого вы можете использовать метод String.format(String format, Object ... args).Вместо использования ? вы можете использовать формат C %x, где x может быть d (для целых), s (для строковых значений) и т. Д.

Пример .

Также вы можете просмотреть метод класса Formatter.format.Он показывает все флаги форматирования, приемлемые для форматирования (метод String.format() использует Formatter для форматирования).

5 голосов
/ 02 сентября 2011

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

public class Logger {

    public static void main(String[] args) {
        new Logger().info("Info: param1 is ?, param2 is ?", new String[] { "a", "b" });
        new Logger().info("Info: param1 is ?, param2 is ?", "a", "b");
    }

    public void info(final String message, final String... args) {
        System.out.printf(message.replace("?", "%s") + "%n", args);
    }

}

Однако вам следует подумать об использовании правильных заполнителей вместо «?».Например:

 public class Logger {

    public static void main(String[] args) {
        new Logger().info("Info: param1 is %s, param2 is %s", new String[] { "a", "b" });
        new Logger().info("Info: param1 is %s, param2 is %s", "a", "b");
    }

    public void info(final String message, final String... args) {
        System.out.printf(message + "%n", args);
    }

}

Обе версии напечатают:

Info: param1 is a, param2 is b
Info: param1 is a, param2 is b
2 голосов
/ 02 сентября 2011

Если вам не нужно беспокоиться о экранировании '?', и вы не можете использовать строки формата printf (), вы можете обойтись без:

public void info(String message, String[] params) {
    System.out.println(
        String.format(message.replace("?", "%s"), params)
    );
}

Вот так:

info("apple is to ? as eve is to ?",
    new String[] { "banana", "noon" });

Какие отпечатки: apple is to banana as eve is to noon


Если вам нужна более сложная логика, например, экранирование, то вам, вероятно, понадобится полноценный поиск и замена на основе регулярного выражения Pattern.

0 голосов
/ 02 сентября 2011

в цикле на params [] используйте regexp, чтобы найти каждый '?' в вашей строке и замените его текущим параметром. Остерегайтесь нулей и найдите правильный способ убежать? (угадайте \? доставит немного проблем, лучше ??)

...