0

我需要检查一个数字中的位数是否等于其他数字。我能想到的最好方法是:

require(Number.toString  == """\d{8}""", throw new InvalidDateFormatException("Wrong format for string parameter"))

其中所需的位数是 8。有没有更好的方法?

4

5 回答 5

9

一种选择:

require(Number.toString.length == 8, throw new InvalidDateFormatException("Wrong format for string parameter"))
于 2013-10-25T13:01:17.430 回答
1

另一种(学术)方法是计算数字:

def digits(num: Int) = {
  @scala.annotation.tailrec
  def run(num: Int, digits: Int): Int =
    if(num > 0) run(num / 10, digits + 1)
    else        digits

  run(math.abs(num), 0)
}

然后,例如,您可以使用隐式转换将digits方法添加到现有数字类型。

我会欣然承认这是矫枉过正,而且很可能是过早的优化。

于 2013-10-25T15:37:11.950 回答
0

另一种选择是

require(Number > 9999999 && Number < 100000000,throw new InvalidDateFormatException("Wrong format for string parameter"))
于 2013-10-25T13:22:17.147 回答
0

不是很优雅,但要避免转换为字符串:

def check(num: Int, digits: Int) = {
  val div = math.pow(10, digits - 1)

  num < div * 10 && num > div - 1
}

println(check(12345678, 8)) // true
println(check(12345678, 9)) // false
println(check(12345678, 7)) // false
于 2013-10-25T14:24:37.077 回答
0

像这样的东西应该让你得到小数位数

def countDecimals(d: Double): Int = (BigDecimal(d) - BigDecimal(d.toInt)).precision

countDecimals(10321.1234) == 4 // True

如果你想得到数字的全长:

BigDecimal(d).precision

BigDecimal(10321.1234).precision == 9 // True
于 2017-08-28T16:49:29.513 回答