Scala: convert string to Int or None

别来无恙 提交于 2019-11-26 19:57:05

问题


I am trying to get a number out of an xml field

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

via

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

Sometimes there may not be a value in the xml, though. The text will be "" and this throws an java.lang.NumberFormatException.

What is a clean way to get either an Int or a None?


回答1:


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



回答2:


More of a side note on usage following accepted answer. After import scala.util.Try, consider

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

or similarly but in a bit more elaborated form that addresses only the relevant exception in converting onto integral values, after import java.lang.NumberFormatException,

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

Thus,

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

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

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



回答3:


Scala 2.13 introduced String::toIntOption:

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



回答4:


Here's another way of doing this that doesn't require writing your own function and which can also be used to lift to 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)

(A nice blog post on the subject.)



来源:https://stackoverflow.com/questions/23811425/scala-convert-string-to-int-or-none

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!