如何在Scala中使用java.String.format?

我正在尝试使用string的.format方法。 但是,如果在string中放置%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。

尽pipe之前所有的回复都是正确的,但它们都是用Java编写的。 这是一个Scala示例:

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

我也有一个关于如Python的%运算符这样的format的博客文章,可能是有用的。

您不需要使用数字来表示定位。 默认情况下,参数的位置就是它在string中出现的顺序。

以下是使用此方法的正确方法示例:

 String result = String.format("The format method is %s!", "great"); // result now equals "The format method is great!". 

您将始终使用%然后再使用其他一些字符来让方法知道如何显示string。 %s可能是最常见的,它只是意味着该参数应该被视为一个string。

我不会列出每一个选项,但我会举几个例子来给你一个想法:

 // 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." 

String.format只是使用了一个java.util.Formatter ,所以对于这些选项的完整描述你可以看到Formatter javadocs 。

而且,正如BalusC所提到的那样,如果需要的话,您可以在文档中看到可以更改缺省参数的顺序。 然而,如果你不止一次地使用同一个参数,那么你可能唯一需要/想要做的就是这样做。

不要看源代码,你应该阅读javadoc的String.format()和Formatter语法 。

您可以在%之后指定值的格式。 例如,对于十进制整数是d ,对于string是s

 String aString = "world"; int aInt = 20; String.format("Hello, %s on line %d", aString, aInt ); 

输出:

 Hello, world on line 20 

要做你所尝试的(使用参数索引),你可以使用: *n*$

 String.format("Line:%2$d. Value:%1$s. Result: Hello %1$s at line %2$d", aString, aInt ); 

输出:

 Line:20. Value:world. Result: Hello world at line 20 

你可以用这个

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

输出:

ABBC

另外请注意,Scala通过一些方法扩展了String(通过隐式转换为由Predef引入的WrappedString),所以您也可以执行以下操作:

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

官方的参考是类Formatter

在斯卡拉2.10

 val name = "Ivan" val weather = "sunny" s"Hello $name, it's $weather today!" 

以下是与String.format()一起使用的格式化程序列表

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html

这是String.format可以做什么的列表。 printf

 int i = 123; o.printf( "|%d|%d|%n" , i, -i ); // |123|-123| o.printf( "|%5d|%5d|%n" , i, -i ); // | 123| –123| o.printf( "|%-5d|%-5d|%n" , i, -i ); // |123 |-123 | o.printf( "|%+-5d|%+-5d|%n" , i, -i ); // |+123 |-123 | o.printf( "|%05d|%05d|%n%n", i, -i ); // |00123|-0123| o.printf( "|%X|%x|%n", 0xabc, 0xabc ); // |ABC|abc| o.printf( "|%04x|%#x|%n%n", 0xabc, 0xabc ); // |0abc|0xabc| double d = 12345.678; o.printf( "|%f|%f|%n" , d, -d ); // |12345,678000| |-12345,678000| o.printf( "|%+f|%+f|%n" , d, -d ); // |+12345,678000| |-12345,678000| o.printf( "|% f|% f|%n" , d, -d ); // | 12345,678000| |-12345,678000| o.printf( "|%.2f|%.2f|%n" , d, -d ); // |12345,68| |-12345,68| o.printf( "|%,.2f|%,.2f|%n" , d, -d ); // |12.345,68| |-12.345,68| o.printf( "|%.2f|%(.2f|%n", d, -d ); // |12345,68| |(12345,68)| o.printf( "|%10.2f|%10.2f|%n" , d, -d ); // | 12345,68| | –12345,68| o.printf( "|%010.2f|%010.2f|%n",d, -d ); // |0012345,68| |-012345,68| String s = "Monsterbacke"; o.printf( "%n|%s|%n", s ); // |Monsterbacke| o.printf( "|%S|%n", s ); // |MONSTERBACKE| o.printf( "|%20s|%n", s ); // | Monsterbacke| o.printf( "|%-20s|%n", s ); // |Monsterbacke | o.printf( "|%7s|%n", s ); // |Monsterbacke| o.printf( "|%.7s|%n", s ); // |Monster| o.printf( "|%20.7s|%n", s ); // | Monster| Date t = new Date(); o.printf( "%tT%n", t ); // 11:01:39 o.printf( "%tD%n", t ); // 04/18/08 o.printf( "%1$te. %1$tb%n", t ); // 18. Apr 

尽pipe@Londo提到了Scala的“s”string插值器,但我认为Scala的“f”string插值器与原始问题更相关。 在其他响应中使用过几次的例子也可以这样写(从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? 

与原始问题的联系是要知道:

  • formatted是以字母“f”为前缀的string定义的。 这是“f”(格式)string内插器。
  • “f”string插入器使用java.util.Formatter
  • java.lang.String.format使用相同的java.util.Formatter

string插值的好处在于,它可以让您看到哪个variables被直接replace为string,而不必将其与String.format方法的参数相匹配。

在scala中,对于string插值,我们有$节省了一天,使我们的生活变得轻松:

例如:你想要定义一个函数,它需要input名字和年龄,并且用你的名字表示你的年龄。 这可以写成这样:

 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岁的年龄!

那么function可能是:

 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