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

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

 String template = "You have %1 tickets for %d",
 Brr object = new Brr(template, {new Integer(1), new Date()});
 object.print();
6
задан EugeneP 1 June 2010 в 08:38
поделиться

6 ответов

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

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

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

9
ответ дан 8 December 2019 в 04:51
поделиться

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

}
1
ответ дан 8 December 2019 в 04:51
поделиться

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

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

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

4
ответ дан 8 December 2019 в 04:51
поделиться

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

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

5
ответ дан 8 December 2019 в 04:51
поделиться

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

1
ответ дан 8 December 2019 в 04:51
поделиться

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

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
ответ дан 8 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: