如何检查一个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