我正在尝试使用字符串的.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。
你不需要用数字来表示位置。默认情况下,参数的位置只是它在字符串中出现的顺序。
下面是正确使用这个短语的例子:
String result = String.format("The format method is %s!", "great");
// result now equals "The format method is great!".
您将始终使用%后跟一些其他字符来让方法知道应该如何显示字符串。%s可能是最常见的,它只是意味着参数应该被视为字符串。
我不会列出所有选项,但我会举几个例子,让你有个概念:
// we can specify the # of decimals we want to show for a floating point:
String result = String.format("10 / 3 = %.2f", 10.0 / 3.0);
// result now equals "10 / 3 = 3.33"
// we can add commas to long numbers:
result = String.format("Today we processed %,d transactions.", 1000000);
// result now equals "Today we processed 1,000,000 transactions."
字符串。格式只使用java.util。Formatter,因此对于选项的完整描述,您可以查看Formatter javadocs。
而且,正如BalusC提到的,您将在文档中看到,如果需要,可以更改默认参数的顺序。然而,可能你唯一需要/想要这样做的时候是你不止一次使用相同的参数。
虽然@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的参数匹配。格式的方法。