Scala中的数字格式?

时间:2009-08-29 05:32:34

标签: scala

我从文件中动态更改输入读数。这些数字可以是IntDouble。为什么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。我无法使用StringAnyVal因为我执行了一些数学运算。

谢谢,

7 个答案:

答案 0 :(得分:29)

scala> "%1.0f" format 1.0
res3: String = 1

如果您输入的是IntDouble,则可以这样做:

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