Scala中的字符串格式化 - 最大十进制精度

15

"%.3f".format(1) 的返回结果为 1.000
"%.3f".format(4.0/3.0) 的返回结果为 1.333

是否有一种简单的方法可以使这些语句返回 11.333 呢?我以为标准的 printf 格式已经指定了这个精度作为最大值,但显然在Scala中并不是这样。


1
Scala只是使用普通的Java格式,因此这个问题并不是特定于Scala的。请参阅http://download.oracle.com/javase/7/docs/api/java/util/Formatter.html以获取有关格式化字符串的完整描述。 - Alexey Romanov
2
"%.3f".format(1) 不会返回 1.000,而是会失败。需要使用 "%.3f".format(1.0) 或者 1f。否则你会得到一个 java.util.IllegalFormatConversionException: f != java.lang.Integer。 - user unknown
3个回答

30

printf使用的默认格式化程序似乎是通用的,不具备与[DecimalFormat][1]相同的全部支持。您可以按照以下方式实例化自定义格式化程序:

scala> import java.text.DecimalFormat 
import java.text.DecimalFormat

scala> val formatter = new DecimalFormat("#.###")
formatter: java.text.DecimalFormat = java.text.DecimalFormat@674dc

scala> formatter.format(1)
res36: java.lang.String = 1

scala> formatter.format(1.34)
res37: java.lang.String = 1.34

scala> formatter.format(4.toFloat / 3)
res38: java.lang.String = 1.333

scala> formatter.format(1.toFloat)
res39: java.lang.String = 1

更多信息请参见:http://docs.oracle.com/javase/tutorial/java/data/numberformat.html


7

"%.3f".format(1.0f)将返回1.000,而不会抛出java.util.IllegalFormatConversionException异常,因为它使用了正确的类型(期望Float,而不是Int)。

您可以使用以下方法来获得预期结果:

def format(x:AnyVal):String = x match {
  case x:Int => "%d".format(x)
  case x:Long => "%d".format(x)
  case x:Float => "%.3f".format(x)
  case x:Double => "%.3f".format(x)
  case _ => ""
}

该方法将根据参数类型返回预期格式。

2
这仍然会返回“1.000”,表示1.0f。 - Amir Raminfar

0

把格式化后的零直接去掉怎么样?

scala> Array(1.0,1.10,1.110).map("%.3g" format _).map(_.replaceAll("[.0]*$",""))
res7: Array[java.lang.String] = Array(1, 1.1, 1.11)

2
小心使用这个,因为它使用本地设置来选择要用作小数点的符号。它可能是','而不是'.'。 - Heptic

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