Форматирование строк в scala - максимальная десятичная точность

"%.3f".format(1) возвращает 1.000.
"%.3f".format(4.0/3.0) возвращает 1.333.

Есть ли простой способ получить эти возвращения 1 и 1.333? Я думал, что стандартный формат printf указывает, что точность как максимальная уже, но, по-видимому, не в Scala.

Ответы

Ответ 1

Форматирование по умолчанию, используемое 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.

Ответ 2

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

Этот метод вернет ожидаемый формат на основе типа аргумента.

Ответ 3

Как просто избавиться от нулей после форматирования?

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)