如何在Scala中格式化字符串?

27
我需要打印一个包含scala.Long的格式化字符串。java.lang.String.format()在编译时与scala.Long(compile time)和RichLong(java.util.IllegalFormatConversionException)不兼容。
编译器警告以下工作代码中Integer的过时: ```` 我需要打印一个包含scala.Long的格式化字符串。java.lang.String.format()在编译时与scala.Long(compile time)和RichLong(java.util.IllegalFormatConversionException)不兼容。
编译器警告以下工作代码中Integer的过时:
val number:Long = 3243
String.format("%d", new java.lang.Long(number))

我应该改变格式化程序、数据类型还是其他什么?

3个回答

42

您可以尝试类似以下的方法:

val number: Long = 3243
"%d".format(number)

9
解释“为什么”这一点也很有价值。 - Kevin Wright
在这种情况下,.format将是从字符串字面量隐式创建的StringLike方法。 - expert

22

在Scala中,格式化方法直接存在于String的实例上,因此您不需要/不想要静态类方法。您也不需要手动包装long原始类型,让编译器为您处理这一切!

String.format("%d", new java.lang.Integer(number))

因此最好写成

"%d".format(number)

7

@Bruno的答案是在大多数情况下您应该使用的。

如果你必须使用Java方法来进行格式化,请使用

String.format("%d",number.asInstanceOf[AnyRef])

这将为Java很好地封装Long


这个可以工作。你知道为什么这不会像我的RichLong方法那样导致运行时错误吗? - Basilevs
2
对于Java来说,RichLong只是一个随机的类。Java期望看到一个对应于"%d"的装箱原始整数。因此,当它得到一个RichLong时,Java自然会抛出异常。asInstanceOf[AnyRef]优先将其装箱为java.lang类,而不是Rich类。 - Rex Kerr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接