Scala:将字符串转换为 Int 或 None

Posted

技术标签:

【中文标题】Scala:将字符串转换为 Int 或 None【英文标题】:Scala: convert string to Int or None 【发布时间】:2014-07-11 18:17:55 【问题描述】:

我正在尝试从 xml 字段中获取一个数字

...
<Quantity>12</Quantity>
...

通过

Some((recipe \ "Main" \ "Quantity").text.toInt)

但有时 xml 中可能没有值。文本将是 "",这会引发 java.lang.NumberFormatException。

获取 Int 或 None 的干净方法是什么?

【问题讨论】:

Scala is a string parseable as a double的可能重复 【参考方案1】:

Scala 2.13介绍String::toIntOption

"5".toIntOption                 // Option[Int] = Some(5)
"abc".toIntOption               // Option[Int] = None
"abc".toIntOption.getOrElse(-1) // Int = -1

【讨论】:

【参考方案2】:

这是另一种不需要编写自己的函数的方法,也可以用于提升到Either

scala> import util.control.Exception._
import util.control.Exception._

scala> allCatch.opt  "42".toInt 
res0: Option[Int] = Some(42)

scala> allCatch.opt  "answer".toInt 
res1: Option[Int] = None

scala> allCatch.either  "42".toInt 
res3: scala.util.Either[Throwable,Int] = Right(42)

(关于主题的nice blog post。)

【讨论】:

你的最后一个例子不会给出那个结果。看起来像是一个剪切粘贴错误。 哎呀。谢谢。只是因为左边太长而改变了它。【参考方案3】:

在接受的答案之后,更多关于用法的旁注。 import scala.util.Try之后,考虑

implicit class RichOptionConvert(val s: String) extends AnyVal 
  def toOptInt() = Try (s.toInt) toOption

或类似但更详细的形式,仅解决转换为整数值的相关异常,在import java.lang.NumberFormatException之后,

implicit class RichOptionConvert(val s: String) extends AnyVal 
  def toOptInt() = 
    try  
      Some(s.toInt) 
     catch  
      case e: NumberFormatException => None 
    

因此,

"123".toOptInt
res: Option[Int] = Some(123)

Array(4,5,6).mkString.toOptInt
res: Option[Int] = Some(456)

"nan".toInt
res: Option[Int] = None

【讨论】:

不应该是"nan".toInt"nan".toOptInt【参考方案4】:
scala> import scala.util.Try
import scala.util.Try

scala> def tryToInt( s: String ) = Try(s.toInt).toOption
tryToInt: (s: String)Option[Int]

scala> tryToInt("123")
res0: Option[Int] = Some(123)

scala> tryToInt("")
res1: Option[Int] = None

【讨论】:

如果您要解析大量空字符串,您可能希望显式捕获它们而不是每次都抛出异常:if (s.isEmpty) None else Try(s.toInt).toOption

以上是关于Scala:将字符串转换为 Int 或 None的主要内容,如果未能解决你的问题,请参考以下文章

如何在 scala 中将 RDD[(int, string)] 转换为 Dataframe

将 Scala 中的列表转换为 Python 列表或数据帧

在Scala中将字符串转换为运算符

Java 或 Scala。如何将 \x22 等字符转换为字符串

Scala 库将数字(Int、Long、Double)与 Array[Byte] 相互转换

如何将 Int 转换为有序 (Scala)