如何在 Scala 中从 String 转换 Long

cal*_*vin 0 scala

我知道我可以解析LongString类似下面

"60".toLong
Run Code Online (Sandbox Code Playgroud)

LongDouble如下转换

60.0.toLong
Run Code Online (Sandbox Code Playgroud)

或转换Long来自一个StringDouble类似于下面

"60.0".toDouble.toLong
Run Code Online (Sandbox Code Playgroud)

但是,我不能执行以下操作

"60.0".toLong
Run Code Online (Sandbox Code Playgroud)

所以我的问题是使用是否.toDouble.toLong是最佳实践,还是应该使用类似的东西try ... catch ...

同时,还有一个问题,当我尝试将一个非常大的转换Long为 时Double,可能会有一些精度损失,我想知道如何解决这个问题?

"9223372036854775800.31415926535827932".toDouble.toLong
Run Code Online (Sandbox Code Playgroud)

Tim*_*Tim 5

Try无论如何,您应该将操作包装在 a 中,以防字符串无效。

你在里面做什么Try取决于"60.0"你的应用程序中是否是一个有效的值。

如果有效,则使用两步转换。

Try("60.0".toDouble.toLong) // => Success(60)
Run Code Online (Sandbox Code Playgroud)

如果无效,请使用一步版本。

Try("60.0".toLong) // => Failure(java.lang.NumberFormatException...)
Run Code Online (Sandbox Code Playgroud)

回答更新的问题:

9223372036854775800.31415926535827932超出 a 的范围Double,因此您需BigDecimal要这样做。

Try(BigDecimal("9223372036854775800.31415926535827932").toLong)
Run Code Online (Sandbox Code Playgroud)

但是你是非常接近的最大值Long,所以如果真的数字是大我建议避免Long使用BigDecimalBigInt

Try(BigDecimal("9223372036854775800.31415926535827932").toBigInt)
Run Code Online (Sandbox Code Playgroud)

请注意,toLong如果BigDecimal太大不会失败,它只会给出错误的值。