2013-10-25 102 views
0

我需要检查一个数字中的位数是否等于某个其他数字。我能想到的最佳方式是:检查斯卡拉的数字位数

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

其中需要的位数是8.有没有更好的方法?

+0

'字符串== regex'可能永远不会评估为true,因为'=='不计算正则表达式。改用'matches'。 – sschaef

回答

5

一种选择:

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

另一种方法是

require(Number > 9999999 && Number < 100000000,throw new InvalidDateFormatException("Wrong format for string parameter")) 
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 
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方法添加到现有的数字类型中。

我很乐意承认这是过度杀伤性的,并且可能是过早的优化。

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 
+0

不完全确定这个'.precision'是如何工作的。 'BigDecimal(0.00034).precision'返回:'Int 2' – user7552