如何将任何数字转换为长数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将任何数字转换为长数相关的知识,希望对你有一定的参考价值。
假设我有:
val number:AnyVal
我知道x可以是任何数字(对于我们的目的,一个Float,Double,Int,Long)。
将这样的数字转换为Long的最简单方法是什么:
val l = number.toLong //fails for AnyVal
答案
怎么样:
scala> import scala.util.Try
import scala.util.Try
scala> val i1: Int = 23
i1: Int = 23
scala> val l1: Long = 42
l1: Long = 42
scala> val f1: Float = 14.9f
f1: Float = 14.9
scala> val d1: Double = 14.96
d1: Double = 14.96
scala> val b1: Boolean = true
b1: Boolean = true
scala> List(i1, l1, f1, d1, b1) map (x => Try(x.asInstanceOf[Number].longValue)) foreach (println(_))
Success(23)
Success(42)
Success(14)
Success(14)
Failure(java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.Number)
scala> List(i1, l1, f1, d1, b1) map (x => Try(x.asInstanceOf[Number].longValue)) foreach (n => println(n.get))
23
42
14
14
java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.Number
at $anonfun$1$$anonfun$apply$1.apply$mcJ$sp(<console>:14)
at $anonfun$1$$anonfun$apply$1.apply(<console>:14)
at $anonfun$1$$anonfun$apply$1.apply(<console>:14)
at scala.util.Try$.apply(Try.scala:161)
at $anonfun$1.apply(<console>:14)
at $anonfun$1.apply(<console>:14)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.immutable.List.foreach(List.scala:318)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
at scala.collection.AbstractTraversable.map(Traversable.scala:105)
at .<init>(<console>:14)
另一答案
如果你知道它肯定会是Float,Double,Int或Long,你可以将它强制转换为数字。然后你可以调用longValue:
val number:AnyVal = 10
val l:Long = number.asInstanceOf[Number].longValue
另一答案
更新了Scala 2.11的答案
我的原始答案在较新版本的Scala中不起作用,因为隐含的RichLong转换不再可用。
此更新版本适用于数字子类型的类型匹配,也适用于Scala 2.11中隐式转换的字符串:
object LongNumber {
def cast(number: Any): Long = number match {
case n: Number => n.longValue()
case x => throw new IllegalArgumentException(s"$x is not a number.")
}
// Test cases
def main(args: Array[String]): Unit = {
val twelveByte: Byte = 0x0c
val twelveString: String = "12"
println(s"Converting a long: ${cast(12L)}")
println(s"Converting an int: ${cast(12)}")
println(s"Converting a double: ${cast(12.0)}")
println(s"Converting a byte: ${cast(twelveByte)}")
println(s"Converting a string: $twelveString")
}
}
匹配技术是其他答案中使用的铸造技术的微小变化。
旧版Scala的原始答案
尝试在匹配块中隐式转换为RichLong似乎工作得非常好:
import scala.runtime.RichLong
...
def cast(number: Any): Long = number match {
case n: RichLong => n.toLong
case x => throw new IllegalArgumentException(s"$x is not a number.")
}
如果您想要满足这种可能性,也可以添加一个用于匹配数字格式的字符串的大小写。
另一答案
如果您没有关于更具体类型的任何信息,那么您将必须针对每个选项进行模式匹配。
以上是关于如何将任何数字转换为长数的主要内容,如果未能解决你的问题,请参考以下文章