Scala中的数字格式?

16 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
Run Code Online (Sandbox Code Playgroud)

我无法使用,Int因为我得到的一些输入是Doubles.我不能使用StringAnyVal因为我执行一些数学运算.

谢谢,

Dan*_*ral 30

scala> "%1.0f" format 1.0
res3: String = 1
Run Code Online (Sandbox Code Playgroud)

如果您的输入是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
}
Run Code Online (Sandbox Code Playgroud)

用法:

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...
Run Code Online (Sandbox Code Playgroud)

否则,您可以使用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
Run Code Online (Sandbox Code Playgroud)

  • @juancn我是如何将窗户类型安全抛出的?顺便说一句,"`var n = 1.0; n.toInt.toString`"产生`1`,而不是`1.0`. (4认同)
  • 问题是在`fmt`中你说你接受'Any'实际上不是真的,因为如果我传递一个String,你会抛出一个IllegalArgumentException.你可以这样做:`def fmt [T <%math.ScalaNumericConversions](n:T)= if(n.toInt == n)n.toInt.toString else n.toString`这是安全的.仅当类型系统无法表达一组合理的约束时,才应抛出非法的参数异常(例如,scala不允许您将范围整数指定为类型). (2认同)

nur*_*ion 8

var x:Double = 1
var y:Double = 1.0

print(x) // => 1.0
print(y) // => 1.0
Run Code Online (Sandbox Code Playgroud)

如果我理解你的问题,你想scala以不同的方式打印x和y吗?问题是x和y都是Double类型的变量,看起来是一样的.

为什么要明确定义变量的类型?

var x = 1 
var y= 1.0

print(x) // => 1
print(y) // => 1.0
Run Code Online (Sandbox Code Playgroud)


Jes*_*per 6

用途printf:

printf("The value is %.0f", x)
Run Code Online (Sandbox Code Playgroud)

有关格式字符串的说明,请参阅Java SE 6 API文档中的此页面.

请注意,您也可以使用Scala中的Java库,因此也可以从Scala中使用其他格式化Java编号的方法.例如,您可以使用类java.text.DecimalFormat:

val df = new java.text.DecimalFormat("#####")
println(df.format(x))
Run Code Online (Sandbox Code Playgroud)

  • 如果你想要,你需要将它存储为字符串.`double`不记得你是否用"1"或"1.0"分配了它. (3认同)
  • Kodo,数字本身并不具有多个数字.值为1的数字和值为1.0的数字之间没有区别. (2认同)

cdm*_*kay 5

使用Scala 2.10开始,你可以使用f

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
Run Code Online (Sandbox Code Playgroud)