如何检查一个string是否是Scala中的十进制数字

我对Scala还是比较陌生的,而且我几乎每天都在发现新的,有趣的做事方式,但是它们并不总是合理的,有时在语言中已经存在,不了解他们。 所以,用这个序言,我正在检查给定的string是否完全由数字组成,所以我在做:

def isAllDigits(x: String) = x.map(Character.isDigit(_)).reduce(_&&_) 

这是明智的还是不必要的愚蠢? 那有更好的办法吗? 只是调用x.toInt并捕获exception,还是不那么惯用? 是否有性能优势/缺点?

尝试这个:

 def isAllDigits(x: String) = x forall Character.isDigit 

forall接受一个函数(在这种情况下是Character.isDigit ),该函数接受一个集合的元素types的参数并返回一个Boolean ; 如果函数对集合中的所有元素返回true ,则返回true否则返回false

你想知道如果string是一个整数? 然后。 .toInt这个地方,赶上例外。 你是否想知道string是否都是数字? 然后问一个:

 s.forall(_.isDigit) s matches """\d+""" 

你也可以考虑这样的事情:

 import scala.util.control.Exception.allCatch def isLongNumber(s: String): Boolean = (allCatch opt s.toLong).isDefined // or def isDoubleNumber(s: String): Boolean = (allCatch opt s.toDouble).isDefined 

你可以简单地使用这个正则expression式。

 val onlyDigitsRegex = "^\\d+$".r def isAllDigits(x: String) = x match { case onlyDigitsRegex() => true case _ => false } 

或干脆

 def isAllDigits(x: String) = x.matches("^\\d+$") 

为了改善这一点,你可以使用我的库模式的pimp使它成为你的string的一种方法:

 implicit def AllDigits(x: String) = new { def isAllDigits = x.matches("^\\d+$") } "12345".isAllDigits // => true "12345foobar".isAllDigits // => false 

@ Jesper的答案是现货。

不要做我在下面的build议(解释如下)

既然你正在检查一个给定的string是否是数字(标题说明你想要一个小数),那么假设你打算在所有守卫都通过的情况下进行转换。

一个简单的隐式范围将节省高达9键击;-)

 implicit def str2Double(x: String) = x.toDouble 

为什么这是危险的

 def takesDouble(x: Double) = x 

现在,编译器将允许takesDouble("runtime fail")因为隐式尝试将使用的任何string转换为Double,并保证成功为零。

隐式转换似乎更适合于在转换失败时提供可接受的默认值的情况(这并非总是如此;因此隐含谨慎)

Try可能不是性能明智的最佳select,但否则它是整洁的:

 scala> import scala.util.Try scala> Try{ "123x".toInt } res4: scala.util.Try[Int] = Failure(java.lang.NumberFormatException: For input string: "123x") scala> Try{ "123x".toInt }.isSuccess res5: Boolean = false