2011-11-20 7 views
15

"%.3f".format(1)1.000を返します。
"%.3f".format(4.0/3.0)1.333を返します。スカラーでの文字列フォーマット - 最大10進精度

これらの返信を行う簡単な方法はありますか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]よりも、すべて同じサポートを持っていない一般的なもののようです。あなたはこれらの線に沿ってカスタムフォーマッタをインスタンス化することができます

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 

参照:詳細については、http://docs.oracle.com/javase/tutorial/java/data/numberformat.htmlを。

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

関連する問題