簡體   English   中英

將字符串解析為布爾值或整數

[英]Parsing a String to Boolean or Int

要將字符串解析為一個int,我們可以執行theString.toInt ,以及一個布爾的theString.toBoolean 我該如何使它通用?

我想以某種方式參數化一個函數,以便我可以嘗試將字符串解析為布爾值或整數,處理錯誤並在錯誤時返回默認值等。

我有這個:

  def tryParsing[T: TypeTag](value: String)(implicit errorAccumulator: Accumulator[Int]): Option[T] = {

    // scala's .toBoolean only permits exactly "true" or "false", not numeric booleans.
    val validBooleans = Map(
      "true" -> true,
      "false" -> false,
      "1" -> true,
      "0" -> false
    )

    import scala.reflect.runtime.universe._

    // doesn't work. Also, using TypeTag doesn't seem to work.
    typeOf[T] match {
      case t if t <:< typeOf[Boolean] =>
        val result = validBooleans.get(value.asInstanceOf[String].toLowerCase)

        if (result.isEmpty) {
          logger.warn(s"An error occurred parsing the boolean value `$value`")
          errorAccumulator += 1
        }

        result.asInstanceOf[Option[T]]

      case _ =>
        Try(value.asInstanceOf[T]) match {

          case Success(x) => Some(x: T)
          case Failure(e) =>
            logger.warn(s"An parsing error occurred: $e")
            errorAccumulator += 1
            None
        }
    }
  }

我無法在類型標簽上進行匹配。 我猜這是因為如果valueT類型的,則typetag會阻止其類型被擦除。 但是在這里,我想這樣稱呼:

tryParsing[Boolean]("1")         // value from variable

如何在類型上進行匹配,或者如何在Scala 2.10中做我想做的事情?

使用typeclass模式:

trait Parser[T] {
  def parse(input: String): Option[T]
}

def parse[T](input: String)(implicit parser: Parser[T]): Option[T] =
  parser.parse(input)

import util.Try
implicit object IntParser extends Parser[Int] {
  def parse(input: String) = Try(input.toInt).toOption
}
implicit object BooleanParser extends Parser[Boolean] {
  def parse(input: String) = Try(input.toBoolean).toOption
}

瞧:

scala> parse[Int]("3")
res0: Option[Int] = Some(3)

scala> parse[Int]("zzz")
res1: Option[Int] = None

scala> parse[Boolean]("true")
res2: Option[Boolean] = Some(true)

scala> parse[Boolean]("zzz")
res3: Option[Boolean] = None

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM