Scala: convert string to Int or None

前端 未结 4 1287
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-05 06:47

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

...
12
...

via

Some((recipe \\ \"Main\" \\         


        
相关标签:
4条回答
  • 2020-12-05 07:06
    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
    
    0 讨论(0)
  • 2020-12-05 07:17

    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
    
    0 讨论(0)
  • 2020-12-05 07:19

    Scala 2.13 introduced String::toIntOption:

    "5".toIntOption                 // Option[Int] = Some(5)
    "abc".toIntOption               // Option[Int] = None
    "abc".toIntOption.getOrElse(-1) // Int = -1
    
    0 讨论(0)
  • 2020-12-05 07:27

    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.)

    0 讨论(0)
提交回复
热议问题