Scala方式将任意数字转换为Double

Nie*_*and 5 scala type-conversion

我需要做一些原始数据解析,我被迫使用Any类型.如果我读取的数据是任何数字格式(Int/Double/Long/...)我需要将其转换为double,否则(例如String)我需要将其保留为空.这就是我想出的:

def extractDouble(expectedNumber: Any): Option[Double] = expectedNumber match {
  case i: Int => Some(i.toDouble)
  case l: Long => Some(l.toDouble)
  case d: Double => Some(d)
  case _ => None
}
Run Code Online (Sandbox Code Playgroud)

这显然看起来不太合适.在scala中有没有更好的方法来解决这个问题?

Pab*_*lgo 9

一旦您在编译时丢失了类型信息,因为它恰好是您的输入类型是Any其要求的一部分,因此没有比expectedNumber运行时检查更多的选项了isInstanceOf.

这可以通过您在建议的解决方案中执行的类型模式匹配来实现.我认为这是您案例中最好的解决方案.

但是,有一种替代方法是使用Try它并将其转换为Option.例如:

Try(expectedNumber.toString.toDouble).toOption
Run Code Online (Sandbox Code Playgroud)

这在很多方面都是一个肮脏的解决方案(根本没有效率,使用控制流的异常......)我会定义地使用你的第一种方法