2011-11-20 21 views
15

"%.3f".format(1)返回1.000
"%.3f".format(4.0/3.0)返回1.333scala中的字符串格式 - 最大小数精度

有没有一些简单的方法来获得这些回报11.333?我认为标准printf格式指定的精度已达到最大值,但显然不在Scala中。

+1

Scala只是使用普通的Java格式,所以这个问题并不是Scala特有的。有关格式化字符串的完整说明,请参阅http://download.oracle.com/javase/7/docs/api/java/util/Formatter.html。 –

+2

'“%.3f”.format(1)'不返回1.000,但失败。 '“%.3f”.format(1.0)'或1f是必需的。否则你得到一个'java.util.IllegalFormatConversionException:f!= java.lang.Integer' –

回答

23

通过使用printf的默认格式似乎是一个通用的一个不具有全部超过[DecimalFormat][1]同样的支持。有关更多信息,http://docs.oracle.com/javase/tutorial/java/data/numberformat.html:您可以沿着这些线路实例化自定义格式:

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

scala> val formatter = new DecimalFormat("#.###") 
formatter: java.text.DecimalFormat = [email protected] 

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 

见。

6

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

这对1.0f仍然返回“1.000” –

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

相关问题