String.format或类似方法的正确格式字符串

49

我确定我曾经见过这样使用String.format

String.format("Some {1}, {2}, {3}", var1, var2, var3);

有人听说过这个吗?也许我在想C#,是否有一种方法可以在Java中实现相同的功能?

我知道你可以做类似这样的事情:

String.format("Some %s, %d, %s", aString, aNumber, aString)

但我需要的语法是针对前者的...

5个回答

64

你需要的是 MessageFormat,它使用给定的格式和输入参数,例如:

MessageFormat.format("Some {0}, {1}, {2}", var1, var2, var3);

正如已经提到的,String.format仍然可以使用备用语法完成工作,但其功能不够强大,且不是您所请求的内容。


3
经过一些调查发现,String.format实际上比MessageFormat更新。它们在内部使用不同的方法,但整体功能差别不大。因此,据说String.format更快。 - Tobias N. Sasse
不错。在Android中也存在。一种非常简单的格式化方式。无需提供输入类型是一个优点。 - AlikElzin-kilaka

21

我不喜欢在抛出异常和准备错误信息时指定参数的索引或类型。我喜欢 SLF4j 的方式。因此,我像这样包装了 org.slf4j.helpers.MessageFormatter:

public static String subst(String string, Object...objects) {
    return MessageFormatter.arrayFormat(string, objects).getMessage();
}

然后你可以像这样使用它:

public void main(String[] args) {
    throw new RuntimeException(MyUtils.subst("Problem with A={} and B={}!", a, b));
}

对于大多数情况(一个或两个参数),您也可以直接使用:MessageFormatter.format("Problem with A={} and B={}!", a, b);(仍然是org.slf4j.helpers.MessageFormatter) - Tristan

15

是的,这是C#中典型的格式化字符串。在Java中,您可以使用后者,即 String.format("%s %d %d", ...)

另一种方法是使用MessageFormat.format("Some {0}, {1}, {2}", var1, var2, var3),它使用.NET的大括号表示法,正如@Tobias所提到的那样,但需要您导入java.text.MessageFormat。它们还更适用于处理本地化资源,其中通常有外部.properties文件,其中消息格式为Error {0} occurred due to {1}


0

另一种方法是使用Java的String Templates功能。 它在JEP 430中有描述,并且作为JDK 21中的预览功能出现。以下是一个使用示例:

String s = STR."Some \{aString}, \{aNumber}, \{aString}";

Java的字符串模板比其他语言中的特性(例如C#的字符串插值和Python的f-strings)更加灵活和安全。 例如,字符串拼接或插值可能导致SQL注入攻击。
String query = "SELECT * FROM Person p WHERE p.last_name = '" + name + "'";
ResultSet rs = conn.createStatement().executeQuery(query);

但是这个变体(来自JEP 430)可以防止SQL注入。
PreparedStatement ps = DB."SELECT * FROM Person p WHERE p.last_name = \{name}";
ResultSet rs = ps.executeQuery();

-3
如果您想使用空占位符(无位置), 您可以编写一个小实用程序来包装 Message.format(), 就像这样。
    String format(String s, Object... var2) {
        int i = 0;
        while(s.contains("{}")) {
            s = s.replaceFirst(Pattern.quote("{}"), "{"+ i++ +"}");
        }
        return MessageFormat.format(s, var2);
    }

然后,可以像这样使用它:

format("Some {} {} {}", var1, var2, var3);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接