检查Scala中的位数

时间:2013-10-25 12:59:12

标签: scala require

我需要检查一个数字中的位数是否等于其他数字。我能提出的最佳方式是:

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

所需的位数是8.有更好的方法吗?

5 个答案:

答案 0 :(得分:5)

另一种选择:

require(Number.toString.length == 8, throw new InvalidDateFormatException("Wrong format for string parameter"))

答案 1 :(得分: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方法。

我很乐意承认这是过度的,而且很可能是过早的优化。

答案 2 :(得分:0)

另一种选择是

require(Number > 9999999 && Number < 100000000,throw new InvalidDateFormatException("Wrong format for string parameter"))

答案 3 :(得分: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

答案 4 :(得分: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