2015-11-03 92 views
1

要將字符串解析爲int,我們可以執行theString.toInt和布爾值theString.toBoolean。我怎樣才能使這個通用?將字符串解析爲布爾值或整數

我想以某種方式進行參數化的功能,這樣我可以嘗試解析字符串作爲一個布爾值或者int,處理錯誤和返回的錯誤違約等

我有這樣的:

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 

我怎麼能匹配類型或以其他方式做什麼,我想在斯卡拉2.10辦?

+0

使用像'高清解析(X:字符串)=嘗試(x.toBoolean).orElse(TRY(x.toInt ))。GET'。要返回默認值,請使用'getOrElse'。 –

+0

我需要增加累加器和日誌分析錯誤的錯誤,所以我想集中該邏輯。我必須解析大量(<20)不同的數據位。 – jbrown

回答

7

使用類型類模式:

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 
相關問題