2014-02-25 126 views
1

假设我需要在斯卡拉中将字符串转换为Int。如果字符串不是数字,我想返回None而不是抛出异常。字符串到斯卡拉Int中

我发现下面solution

 
def toMaybeInt(s:String) = { 
    import scala.util.control.Exception._ 
    catching(classOf[NumberFormatException]) opt s.toInt 
} 

是否有意义?你会改变/改善它吗?

+2

比使用'Try'其他(@ Brian的回答),我会命名方法'toIntOption'更符合标准Scala的名称一致。 –

回答

6

我会使用scala.util.Try它返回SuccessFailure为可能会引发异常的计算。

scala> val zero = "0" 
zero: String = 0 

scala> val foo = "foo" 
foo: String = foo 

scala> scala.util.Try(zero.toInt) 
res5: scala.util.Try[Int] = Success(0) 

scala> scala.util.Try(foo.toInt) 
res6: scala.util.Try[Int] = Failure(java.lang.NumberFormatException: For input string: "foo") 

所以,toMaybeInt(s: String)变为:

def toMaybeInt(s:String) = { 
    scala.util.Try(s.toInt) 
} 
+0

谢谢,但我现在需要返回'Option'。 – Michael

+0

@Michael使用'toOption'。 – Brian

+0

'Catch [+ T] .toOption'? – Michael

3

为了得到一个选项,在任何情况下,无论是由于数量畸形可能出现的例外,

import scala.util.Try 

def toOptInt(s:String) = Try(s.toInt) toOption 

然后

scala> toOptInt("123") 
res2: Option[Int] = Some(123) 

scala> toOptInt("1a23") 
res3: Option[Int] = None 

此外,考虑

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

因此

scala> "123".toOptInt 
res5: Option[Int] = Some(123) 

scala> "1a23".toOptInt 
res6: Option[Int] = None