Какие классы вы используете для создания строковых шаблонов?

Какие классы вы используете для работы строковых заполнителей?

 String template = "You have %1 tickets for %d",
 Brr object = new Brr(template, {new Integer(1), new Date()});
 object.print();

7 ответов

Решение

У вас есть два варианта:

  • java.util.Formatter
    • Переводчик для printf стиль строки Этот класс обеспечивает поддержку выравнивания и выравнивания макета, общие форматы для числовых, строковых данных и данных даты / времени, а также вывод, зависящий от локали.
  • java.text.MessageFormat,
    • MessageFormat предоставляет средства для создания составных сообщений не зависящим от языка способом. Используйте это для создания сообщений, отображаемых для конечных пользователей.

Из двух, MessageFormat гораздо более мощный. Вот пример использования ChoiceFormat обрабатывать 0, 1, а также >1 бывает по-другому:

import java.text.MessageFormat;
import java.util.Date;
//...

String p = "You have {0,choice,0#none|1#one ticket|1<{0,number,integer} tickets} for {1,date,full}.";
for (int i = 0; i < 4; i++) {
    System.out.println(MessageFormat.format(p, i, new Date()));
}

Это печатает:

You have none for Tuesday, June 1, 2010.
You have one ticket for Tuesday, June 1, 2010.
You have 2 tickets for Tuesday, June 1, 2010.
You have 3 tickets for Tuesday, June 1, 2010.

В документации есть еще много примеров.

Как насчет java.util.Formatter?

Сокращения для этого включают String.format а также System.out.format,

Следующее должно работать:

import java.util.*;


class Brr {
    String template;
    Object[] args;
    public Brr(String template, Object... args) {
        this.template = template;
        this.args = args;
    }
    public void print() {
        System.out.println(String.format(template, args));
    }
}

public class Test {
    public static void main(String... args) {
        String template = "You have %d tickets for %tF";
        Brr object = new Brr(template, new Integer(1), new Date());
        object.print();
    }
}

Выход:

You have 1 tickets for 2010-06-01

Посмотрите http://java.sun.com/j2se/1.5.0/docs/api/java/util/Formatter.html если вы хотите получить полную ссылку на конверсии.

String.format самый простой:

String s = String.format("%s %s", "Hello", "World!");

Вы можете вызвать его с переменным числом параметров, как я показал выше, или передать массив Object и это будет использовать это.

Если вам нужно что-то более мощное для шаблонизации строк, библиотека Apache Velocity будет очень полезна http://velocity.apache.org/

MessageFormat.format() позволяет использовать порядковые параметры, что позволяет легко включить i18n

private final Map<String, String> localizedMessages = new HashMap<String, String>();

private void init() {
    this.localizedMessages.put("de_DE", "{2} Suchtreffer, zeige Ergebnisse ${0} bis ${1}");
    this.localizedMessages.put("en_US", "Showing results {0} through {1} of a total {2");
}

public String getLocalizedMessage(final String locale,
        final Integer startOffset, final Integer endOffset,
        final Integer totalResults) {
    return MessageFormat.format(this.localizedMessages.get(locale),
            startOffset, endOffset, totalResults);

}

Rythm - движок Java-шаблонов, выпущенный с новой функцией, называемой режимом интерполяции строк, которая позволяет вам делать что-то вроде:

String result = Rythm.render("You have @num tickets for @date", 1, new Date());

Вышеприведенный случай показывает, что вы можете передавать аргумент в шаблон по позиции. Ритм также позволяет передавать аргументы по имени:

Map<String, Object> args = new HashMap<String, Object>();
args.put("num", 1);
args.put("date", new Date());
String result = Rythm.render("You have @num tickets for @date", args);

Ссылки:

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