我正在尝试使用字符串的.format方法。但如果我在字符串中放置%1、%2等,则会抛出Java .util. unknownformatconversionexception,指向一个令人困惑的Java源代码段:

private void checkText(String s) {

    int idx;

    // If there are any '%' in the given string, we got a bad format
    // specifier.
    if ((idx = s.indexOf('%')) != -1) {
        char c = (idx > s.length() - 2 ? '%' : s.charAt(idx + 1));
        throw new UnknownFormatConversionException(String.valueOf(c));
    }
}

由此我明白% char是禁止的。如果是这样,那么我应该使用什么参数占位符?

我使用Scala 2.8。


当前回答

还要注意,Scala用许多方法扩展了String(通过Predef引入的WrappedString的隐式转换),所以你还可以做以下事情:

val formattedString = "Hello %s, isn't %s cool?".format("Ivan", "Scala")

其他回答

虽然@Londo提到了Scala的“s”字符串插补器,但我认为Scala的“f”字符串插补器更贴近最初的问题。在其他响应中使用了一些时间的示例也可以这样编写(从Scala 2.10开始):

scala> val name = "Ivan"
name: String = Ivan
scala> val thing = "Scala"
thing: String = Scala
scala> val formatted = f"Hello $name%s, isn't $thing%s cool?"
formatted: String = Hello Ivan, isn't Scala cool?

与原问题的联系是要意识到:

格式化是用前缀为字母“f”的字符串定义的。这是“f”(格式化)字符串插补器。 “f”字符串插补器使用java.util.Formatter java.lang.String.format使用相同的java.util.Formatter

字符串插值的好处是,它可以让您看到哪个变量被直接替换到字符串中,而不必将其与string的参数匹配。格式的方法。

还要注意,Scala用许多方法扩展了String(通过Predef引入的WrappedString的隐式转换),所以你还可以做以下事情:

val formattedString = "Hello %s, isn't %s cool?".format("Ivan", "Scala")

在Scala 2.10中

val name = "Ivan"
val weather = "sunny"

s"Hello $name, it's $weather today!"

虽然前面所有的回答都是正确的,但它们都是用Java编写的。下面是一个Scala示例:

val placeholder = "Hello %s, isn't %s cool?"
val formatted = placeholder.format("Ivan", "Scala")

我也有一篇博客文章是关于如何制作类似Python的%操作符的格式,这可能会很有用。

你可以用这个;

String.format("%1$s %2$s %2$s %3$s", "a", "b", "c");

输出:

A b b c