我正在尝试使用字符串的.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提到的,您将在文档中看到,如果需要,可以更改默认参数的顺序。然而,可能你唯一需要/想要这样做的时候是你不止一次使用相同的参数。

其他回答

在Scala 2.10中

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

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

你不需要用数字来表示位置。默认情况下,参数的位置只是它在字符串中出现的顺序。

下面是正确使用这个短语的例子:

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提到的,您将在文档中看到,如果需要,可以更改默认参数的顺序。然而,可能你唯一需要/想要这样做的时候是你不止一次使用相同的参数。

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

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

在scala中,对于字符串插值,我们有$,这节省了时间,让我们的生活变得更容易:

例如:你想定义一个函数,它接受输入的名字和年龄,并说Hello With名字并说它的年龄。 可以这样写:

def funcStringInterpolationDemo(name:String,age:Int)=s"Hey ! my name is $name and my age is $age"

因此,当你像这样调用这个函数:

funcStringInterpolationDemo("Shivansh",22)

它的输出将是:

Hey ! my name is Shivansh and my age is 22

您可以在同一行中编写代码来更改它,例如,如果您想在年龄上添加10年!

那么函数可以是:

def funcStringInterpolationDemo(name:String,age:Int)=s"Hey ! my name is $name and my age is ${age+10}"

现在输出是:

Hey ! my name is Shivansh and my age is 32

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

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

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