2014-02-25 125 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