Smart Java форматер - PullRequest
       11

Smart Java форматер

0 голосов
/ 27 января 2010

Я ищу умный формататор Java String, похожий на стандартный форматтер:

    StringBuffer buffer = new StringBuffer();
    Formatter formatter = new Formatter(buffer);
    formatter.format("hello %1$s, %2$s and %3$s", "me", "myself", "I");

Проблема в том, что если вы допустите ошибку в формате (например, вы забудете $s), будет сгенерировано исключение. Не совсем то, что я хочу при форматировании сообщения об ошибке (поскольку оно не находится в обычном пути приложения и не может быть проверено).

Конечно, я могу определить свой собственный класс, скажем, принять строку типа "hello $1, $2 and $3, выполнить замену с ($1 -> %1$s) и вызвать toString() для всех параметров, но я уверен лучшее решение уже разработано.

Где-то, в каком-то сосуде ...

Спасибо за любой полезный указатель.

EDIT

Я ищу что-то вроде следующего:

String out = MySpecialFormatter.format("hello $1, $2 and $3", "me", "myself", "I");

если у вас есть ошибка в вашем формате (ну, есть опечатки), он изо всех сил пытается заполнить переменные связывания или вернуть исходную строку формата.

Ответы [ 3 ]

3 голосов
/ 28 января 2010

Иногда ответ прямо здесь ...

import static java.text.MessageFormat.format;

String out = format("hello {0}, {1} and {2}", "me", "myself", "2", "3");

И да, Анон , видимо Сунь думал, что все программисты ленивы.

2 голосов
/ 27 января 2010

Проблема в том, что если вы допустите ошибку в формате (например, вы забудете $ s), будет сгенерировано исключение. Не совсем то, что я хочу при форматировании сообщения об ошибке (поскольку оно не находится в обычном пути приложения и может не проверяться).

Таким образом, вы в основном спрашиваете: «Если я не проверял свой код и он ошибался, что я могу использовать, чтобы скрыть это вместо того, чтобы иметь дело с ним?»

Решение состоит в том, чтобы правильно протестировать весь ваш код . Когда ты это пишешь, желательно.

Если вы настаиваете на том, чтобы скрыть свой плохой код и сделать вид, что его там нет, вы можете сделать следующее:

public class LazyProgrammersFormatter {
    private Formatter _f;

    public LazyProgrammersFormatter(Formatter f) {
        _f = f;
    }

    public bool format(/*can't be bothered looking up the varargs signature, you know what it is*/) {
        try {
            _f.format(/*etc.*/);
            return true;
        } catch (FormatException e) {
            return false;
        }
    }
}
1 голос
/ 27 января 2010

String.format не подходит для того, что вы ищете? Java doc для строкового формата.

...