令牌使用' {}'替换字符串而不是'%s'在String.format中

时间:2014-10-16 07:50:17

标签: java

String.format要求占位符字符串为%s。我正在使用slf4j,它使用{}作为占位符字符串。

JDK中是否有任何内容允许我使用{}作为占位符字符串来执行String.format?

如下面的评论中所述,有MessageFormat.format()但这需要我将索引放在括号之间。例如。 {0}

1 个答案:

答案 0 :(得分:0)

1)您无法避免在Formatter中使用基于“%”的占位符。所以Formatter / Formattable不是解决方案。

2)如果您需要一种方法,用参数值替换{}占位符,很容易实现。

public static String insertPlaceholders(String template, Object... args) {
    if (args.length == 0) {
        return template;
    }
    // best guess for capacity
    final StringBuilder sb = new StringBuilder(template.length() + args.length * 8);
    int index = 0;
    int offset = 0;
    while (index < args.length) {
        final int p = template.indexOf("{}", offset);
        if (p < 0) {
            break;
        }
        sb.append(template, offset, p);
        sb.append(args[index]);
        offset = p + 2;
        ++index;
    }
    sb.append(template, offset, template.length());
    return sb.toString();
}

单元测试:

@Test
public void testInsertPlaceholders() {
    assertSame("Test", StringUtils.insertPlaceholders("Test"));
    assertEquals("Test", StringUtils.insertPlaceholders("Test", 1));
    assertEquals("Test 2", StringUtils.insertPlaceholders("Test {}", 2));
    assertEquals("Test 3 {}", StringUtils.insertPlaceholders("Test {} {}", 3));
    assertEquals("Hello World!", StringUtils.insertPlaceholders("Hello {}!", "World"));
}