Какие классы Вы используете, чтобы заставить строковых заполнителей работать?
String template = "You have %1 tickets for %d",
Brr object = new Brr(template, {new Integer(1), new Date()});
object.print();
У вас есть два варианта:
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.
В документации есть много других примеров.
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);
}
String.format
- самый простой:
String s = String.format("%s %s", "Hello", "World!");
Вы можете вызвать его с переменным числом параметров, как я показал выше, или передать ему массив Object
, и он будет использовать что.
Как насчет java.util.Formatter
?
Сокращения для него включают String.format
и System.out.format
.
Если вам нужно что-то более мощное для создания шаблонов строк, весьма полезна библиотека Apache Velocity http://velocity.apache.org/
Следующее должно работать:
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, если вам нужен полный справочник преобразований.