scala casting option

Scala: convertir cadena a Int o None



casting option (3)

Aquí hay otra forma de hacerlo que no requiere escribir su propia función y que también se puede usar para elevar a 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)

(Una buena publicación de blog sobre el tema).

Estoy tratando de obtener un número de un campo xml

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

vía

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

Sin embargo, a veces puede no haber un valor en el xml. El texto será "" y esto arroja una java.lang.NumberFormatException.

¿Cuál es una forma limpia de obtener un Int o un None?


Más de una nota al margen sobre el uso después de la respuesta aceptada. Después de import scala.util.Try , considere

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

o de forma similar, pero en una forma un poco más elaborada que aborda solo la excepción pertinente al convertir a valores integrales, después de la import java.lang.NumberFormatException ,

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

Así,

"123".toOptInt res: Option[Int] = Some(123) Array(4,5,6).mkString.toOptInt res: Option[Int] = Some(456) "nan".toInt res: Option[Int] = None


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