您使用哪些类来使字符串占位符起作用?
String template = "You have %1 tickets for %d",
Brr object = new Brr(template, {new Integer(1), new Date()});
object.print();
答案 0 :(得分:9)
您有两种选择:
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.
该文档还有更多示例。
答案 1 :(得分:5)
答案 2 :(得分:4)
String.format
是最简单的:
String s = String.format("%s %s", "Hello", "World!");
您可以使用可变数量的参数调用它,如上所示,或者传递一个Object
的数组,它将使用它。
答案 3 :(得分:4)
以下内容应该有效:
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 :(得分:1)
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);
}
答案 5 :(得分:1)
如果你需要一些更强大的功能来模板化字符串,Apache Velocity库非常有用http://velocity.apache.org/
答案 6 :(得分:0)
Rythm现在发布了一个名为 String interpolation mode 的新功能的java模板引擎,它允许您执行以下操作:
String result = Rythm.render("You have @num tickets for @date", 1, new Date());
以上情况表明您可以按位置将参数传递给模板。 Rythm还允许您按名称传递参数:
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);
链接: