복붙노트

[SCALA] 스칼라 : 지능 또는 없음으로 변환 문자열

SCALA

스칼라 : 지능 또는 없음으로 변환 문자열

나는 XML 필드의 숫자를 얻기 위해 노력하고 있어요

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

통하다

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

가끔하지만, XML에서 값이되지 않을 수 있습니다. 텍스트는 "이 될 것"이는 java.lang.NumberFormatException의 발생합니다.

int로 또는 없음 중 하나를 얻을 수있는 깨끗한 방법은 무엇입니까?

해결법

  1. ==============================

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

    2.허용 대답 다음 사용에 보조 노트의 더. 수입 scala.util.Try 후, 고려

    허용 대답 다음 사용에 보조 노트의 더. 수입 scala.util.Try 후, 고려

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

    또는 유사하지만 약간 더 정교한 형태 해당 수입 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
    
  3. ==============================

    3.스칼라 2.13 문자열 :: toIntOption 소개 :

    스칼라 2.13 문자열 :: toIntOption 소개 :

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

    4.여기에 자신의 함수를 작성 필요로하지 않으며, 또한 하나에 들어하는 데 사용할 수있는 것을 이렇게 또 다른 방법이있다.

    여기에 자신의 함수를 작성 필요로하지 않으며, 또한 하나에 들어하는 데 사용할 수있는 것을 이렇게 또 다른 방법이있다.

    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)
    

    (주제에 좋은 블로그 게시물.)

  5. from https://stackoverflow.com/questions/23811425/scala-convert-string-to-int-or-none by cc-by-sa and MIT license