我从文件中动态更改输入读数。这些数字可以是Int
或Double
。为什么Scala会在每.0
个号后打印Double
?有没有办法让Scala以与读取它相同的方式打印它?
示例:
var x:Double = 1
println (x) // This prints '1.0', I want it to print '1'
x = 1.0 // This prints '1.0', which is good
我无法使用Int
,因为我得到的一些输入是Double
s。我无法使用String
或AnyVal
因为我执行了一些数学运算。
谢谢,
答案 0 :(得分:29)
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
答案 1 :(得分:8)
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
答案 2 :(得分:6)
使用printf
:
printf("The value is %.0f", x)
有关格式字符串的说明,请参阅Java SE 6 API文档中的this page。
请注意,您也可以使用Scala中的Java库,因此也可以在Scala中使用其他格式化Java编号的方法。例如,您可以使用课程java.text.DecimalFormat
:
val df = new java.text.DecimalFormat("#####")
println(df.format(x))
答案 3 :(得分:4)
在浮点数末尾使用“_.0”是一种惯例。只是一种知道数字实际上是浮点而不是整数的方法。
如果您真的需要“以与其相同的方式打印它”,您可能需要重新考虑代码的结构方式,可能会保留您的输入数据。如果它只是一个格式问题,最简单的方法是在打印前将值转换为整数:
val x = 1.0
println(x.toInt)
如果某些是整数而有些则不是,则需要更多代码:
def fmt[T <% math.ScalaNumericConversions](n : T) =
if(n.toInt == n) n.toInt.toString else n.toString
val a : Double = 1.0
val b : Double = 1.5
val c : Int = 1
println(fmt(a))
println(fmt(b))
println(fmt(c))
上面的代码应该打印:
1
1.5
1
fmt
方法的签名接受任何类型为ScalaNumericConversions
的子类型,或者可以通过隐式转换转换为一个类型(因此我们可以使用toInt
方法)。
答案 4 :(得分:3)
从Scala 2.10开始,您可以使用the f
interpolator:
scala> val x: Double = 1
x: Double = 1.0
scala> println(f"$x%.0f")
1
scala> val i = 1
i: Int = 1
scala> println(f"$i%.0f")
1
答案 5 :(得分:1)
如果您正在使用Double
,并且要将其格式化为整数时使用String
而不使用.0
,否则应使用小数,那么可以使用{{3 }}:
x.toString.stripSuffix(".0")
// val x: Double = 1.34 => "1.34"
// val x: Double = 1.0 => "1"
答案 6 :(得分: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