Форматирование строк в 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)