Какие классы вы используете для создания шаблонов строк? - PullRequest
6 голосов
/ 01 июня 2010

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

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

Ответы [ 7 ]

9 голосов
/ 01 июня 2010

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

  • 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.

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

5 голосов
/ 01 июня 2010

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

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

4 голосов
/ 01 июня 2010

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

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, если хотите получить полную ссылку на конверсии.

4 голосов
/ 01 июня 2010

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

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

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

1 голос
/ 01 июня 2010

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

1 голос
/ 01 июня 2010

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);

}
0 голосов
/ 01 июля 2012

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);

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...