我需要检查一个数字中的位数是否等于其他数字。我能提出的最佳方式是:
require(Number.toString == """\d{8}""", throw new InvalidDateFormatException("Wrong format for string parameter"))
所需的位数是8.有更好的方法吗?
答案 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