2011-11-20 13 views
15

"%.3f".format(1), 1.000 değerini döndürür.
"%.3f".format(4.0/3.0), 1.333 değerini döndürür.Scala'da dize biçimlendirme - maksimum ondalık kesinlik

1 ve 1.333 numaralarına sahip olmanın kolay bir yolu var mı? Standart printf formatının, zaten maksimum olarak hassas olduğunu belirten, ama görünüşe göre Scala'da olmadığını düşündüm.

+1

Scala, normal Java biçimlendirmesini kullanır, bu nedenle soru gerçekten Scala'ya özgü değildir. Biçimlendirme dizelerinin tam açıklaması için http://download.oracle.com/javase/7/docs/api/java/util/Formatter.html sayfasına bakın. –

+2

'"% .3f ".format (1)', 1.000 döndürmez, ancak başarısız olur. "% .3f" .format (1.0) 'veya 1f gerekiyor. Başka bir "java.util.IllegalFormatConversionException olsun: f! = Java.lang.Integer" –

cevap

23

printf tarafından kullanılan varsayılan biçimlendirici [DecimalFormat][1] daha hepsi aynı desteğe sahip olmayan bir jenerik biri olarak görünüyor. Sen o doğrultuda özel bir biçimlendirici örneğini:

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 

See: http://docs.oracle.com/javase/tutorial/java/data/numberformat.html fazla bilgi için.

6

"%.3f".format(1) çünkü yanlış türde bir java.util.IllegalFormatConversionException atacağım (Float bekleniyor ve bir Int vermek).

"%.3f".format(1.0)'u kullansanız bile, 1.000'u alırsınız.

Sen gibi bir yöntemi kullanabilirsiniz beklenen sonucu elde etmek için aşağıdaki:

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 _ => "" 
} 

Bu yöntem argüman türüne göre beklenen biçimi dönecektir.

+2

Bu hala 1.0f için "1.000" döndürür –

0

Biçimlendirmeden sonra sıfırdan kurtulmak nasıl?

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

Ondalık nokta olarak kullanmak için almak için yerel ayarları kullandığından, buna dikkat edin. . Ve bir ',' olabilir ve 'değil' olabilir. – Heptic

İlgili konular