2011-11-20 114 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

相關問題