Форматирование строк в Scala - максимальная десятичная точность - PullRequest
15 голосов
/ 20 ноября 2011

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

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

Ответы [ 3 ]

25 голосов
/ 21 ноября 2011

Форматер по умолчанию, используемый printf, кажется общим, который не имеет такой же поддержки, как [DecimalFormat][1]. Вы можете создать пользовательский форматировщик в следующем формате:

scala> import java.text.DecimalFormat 
import java.text.DecimalFormat

scala> val formatter = new DecimalFormat("#.###")
formatter: java.text.DecimalFormat = java.text.DecimalFormat@674dc

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.

7 голосов
/ 20 ноября 2011

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

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

0 голосов
/ 20 ноября 2011

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

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...