scala中的字符串格式 - 最大小数精度

时间:2011-11-20 17:22:43

标签: scala

"%.3f".format(1)返回1.000 "%.3f".format(4.0/3.0)会返回1.333

有一些简单的方法可以让这些返回11.333吗?我认为标准printf格式已将精度指定为最大值,但显然不在Scala中。

3 个答案:

答案 0 :(得分:25)

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

答案 1 :(得分:7)

由于错误的类型,

"%.3f".format(1)会抛出java.util.IllegalFormatConversionException(预计会Float,而你会给Int)。

即使您使用"%.3f".format(1.0),也会获得1.000

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

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 :(得分: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)