"%.3f".format(1)
的返回结果为 1.000
。
"%.3f".format(4.0/3.0)
的返回结果为 1.333
。
是否有一种简单的方法可以使这些语句返回 1
和 1.333
呢?我以为标准的 printf
格式已经指定了这个精度作为最大值,但显然在Scala中并不是这样。
"%.3f".format(1)
的返回结果为 1.000
。
"%.3f".format(4.0/3.0)
的返回结果为 1.333
。
是否有一种简单的方法可以使这些语句返回 1
和 1.333
呢?我以为标准的 printf
格式已经指定了这个精度作为最大值,但显然在Scala中并不是这样。
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
"%.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 _ => ""
}
把格式化后的零直接去掉怎么样?
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)