2012-02-06 5 views
1

scala.math.BigDecimal.toString은 "0.888200000"과 같은 것을 반환 할 수 있습니다. 대신 "0.8882"를 원한다면 무엇을 할 수 있습니까? java.math.BigDecimal에는 stripTrailingZeros() 메서드가 있지만 스칼라의 BigDecimal에는이 메서드가 없습니다. scala.math.BigDecimal.underlying을 사용하여 java.math.BigDecimal 최상의 방법을 얻거나 Scala에서 더 좋은 방법이 있습니까?Scala에서 BigDecimal의 후행 0을 제거하는 올바른 방법은 무엇입니까?

답변

6

모든 Java 메소드에 액세스하고 싶지만 underlying을 입력하지 않으려는 경우 암시 적 def는 어떨까요?

val b = math.BigDecimal("0.888200000") 
implicit def bigDecimalToJavaBigDecimal(b: math.BigDecimal) = b.underlying 

scala> b.stripTrailingZeros 
res1: java.math.BigDecimal = 0.8882 

당신은 다시 자바 BigDecimal를 얻을 수 있지만, 이미 위로 math.BigDecimal을 가져올 때 당신이 얻을 스칼라 버전으로 implicit def이 있기 때문에 그 괜찮아, javaBigDecimal2bigDecimal을했다.

+0

내가 물어 보는 것은 "입력하고 싶지 않습니다"가 아니라 성능 및 유형/참조 안전에 관한 것입니다. 이러한 접근 방식으로 이어질 수있는 모든 명백한 문제에 대한 골자입니다. 아무도 더 나은 것을 제안하지 않고 모든 사람들이이 대답을 상향 투표하고 있기 때문에 대답은 "그렇습니다, .underlying은 괜찮습니다. 그리고 후행 0을 버리는 더 좋은 방법은 없습니다"라고 동의 할 것이고 아마도 절대적인. – Ivan

+3

실제로 코드의 여러 위치에서 0을 제거하지 않으므로 (암시 적으로)이 암시 적 메서드를 만드는 번거 로움이 아니라'b.underlying.stripTrailingZeros'를 사용합니다. 소스를 보면 객체의 필드를 반환하기 때문에 '기본'을 사용하면 성능이 저하되지 않습니다. –

+0

실제로'.stripTrailingZeros'를'rs.getBigDecimal (1)'에 추가하여 입구에서 바로 0을 제거합니다 :-) – Ivan

관련 문제