2011-11-20 2 views
15

"%.3f".format(1)1.000을 반환합니다.
"%.3f".format(4.0/3.0)1.333을 반환합니다.스칼라에서 문자열 서식 지정 - 최대 십진수 정밀도

반품 할 수있는 쉬운 방법이 있습니까 11.333? 난 표준 printf 형식이 이미 최대로 정밀도를 지정했지만 분명히 스칼라에서는 그렇지 않다고 생각했습니다.

+1

스칼라는 일반적인 자바 포맷을 사용하기 때문에 스칼라에만 국한되지는 않습니다. 문자열 서식 지정에 대한 자세한 내용은 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