你用什么类来制作字符串模板?

时间:2010-06-01 08:38:27

标签: java string

您使用哪些类来使字符串占位符起作用?

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

7 个答案:

答案 0 :(得分:9)

您有两种选择:

  • java.util.Formatter
    • printf - 样式格式字符串的解释器。此类提供对布局对齐和对齐的支持,数字,字符串和日期/时间数据的常用格式以及特定于语言环境的输出。
  • java.text.MessageFormat
    • MessageFormat提供了一种以与语言无关的方式生成连接消息的方法。使用此选项可构建为最终用户显示的消息。

在这两者中,MessageFormat到目前为止更强大。以下是使用ChoiceFormat处理01>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)

java.util.Formatter怎么样?

简写包括String.formatSystem.out.format

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

链接: