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