Мой фаворит от того, когда я работал над приложением связи прежней версии.
// Magic happens here...
scala> "%1.0f" format 1.0
res3: String = 1
Если ваш ввод - Int
или Double
, вы можете сделать это следующим образом:
def fmt(v: Any): String = v match {
case d : Double => "%1.0f" format d
case i : Int => i.toString
case _ => throw new IllegalArgumentException
}
Использование:
scala> fmt(1.0)
res6: String = 1
scala> fmt(1)
res7: String = 1
scala> fmt(1.0f)
java.lang.IllegalArgumentException
at .fmt(<console>:7)
at .<init>(<console>:6)
at .<clinit>(<console>)
at RequestResult$.<init>(<console>:4)
at RequestResult$.<clinit>(<console>)
at RequestResult$result(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.Dele...
В противном случае вы можете используйте BigDecimals
. Они медленные, но у них есть шкала, поэтому «1», «1.0» и «1.00» все разные:
scala> var x = BigDecimal("1.0")
x: BigDecimal = 1.0
scala> x = 1
x: BigDecimal = 1
scala> x = 1.0
x: BigDecimal = 1.0
scala> x = 1.000
x: BigDecimal = 1.0
scala> x = "1.000"
x: BigDecimal = 1.000
var x:Double = 1
var y:Double = 1.0
print(x) // => 1.0
print(y) // => 1.0
Если я вас понимаю, вы хотите, чтобы scala печатала x и y по-разному? Проблема в том, что x и y являются переменными типа Double и выглядят одинаково.
Почему вы явно определяете тип варов?
var x = 1
var y= 1.0
print(x) // => 1
print(y) // => 1.0
Используйте вывод типа, а не явную типизацию.
scala> val xi = 1
xi: Int = 1
scala> val xd = 1.0
xd: Double = 1.0
scala> println(xi)
1
scala> println(xd)
1.0
Используйте printf
:
printf("The value is %.0f", x)
Описание строки формата см. на этой странице документации Java SE 6.
Обратите внимание, что вы, конечно, также можете использовать библиотеку Java из Scala, поэтому другие способы форматирования чисел из Java также можно использовать из Scala. Например, вы можете использовать класс java.text.DecimalFormat
:
val df = new java.text.DecimalFormat("#####")
println(df.format(x))