我想在groovy中为matches
创建一个模式。输入范围应为0 to 100
,但接受decimal value
。我知道这可以通过使用double
数据类型来实现,但作为一项要求,我需要将此属性的数据类型设置为String
,这就是为什么我需要设置匹配的正确模式的原因String
使其正常工作。可能的输入:
1) 1 - valid
2) 1.5301 - valid
3) 99.6732 - valid
4) 99.1 - valid
5) 100.1 - invalid
6) 100 - valid
非常感谢你!
答案 0 :(得分:2)
这应该有效:
100(\.0+)?|([1-9]?[0-9])(\.[0-9]+)?
答案 1 :(得分:1)
Amber有正确的正则表达式
作为在Groovy中演示此功能的一种方式,您可以执行以下操作:
def testcases = [
[ '1', true ],
[ '1.5301', true ],
[ '99.6732', true ],
[ '99.1', true ],
[ '100.1', false ],
[ '100', true ],
]
testcases.each { val, result ->
assert ( val ==~ /100(\.0+)?|([1-9]?[0-9])(\.[0-9]+)?/ ) == result
}
但是,我可能会这样做:
testcases.each { val, result ->
try {
Double.parseDouble( val ).with {
assert ( it >= 0 && it <= 100 ) == result
}
} catch( ex ) {
assert result == false
}
}
用正则表达式检查范围感觉就像是一条愚蠢的路线
答案 2 :(得分:0)
你可以(并且应该)使用一系列双打:
groovy:000> ((0.0d)..(100.0d)).containsWithinBounds(100.1d)
===> false
groovy:000> ((0.0d)..(100.0d)).containsWithinBounds(99.6732d)
===> true
从字符串获得双倍:
groovy:000> ((0.0d)..(100.0d)).containsWithinBounds("99.6732" as double)
===> true
groovy:000> ((0.0d)..(100.0d)).containsWithinBounds("100.01" as double)
===> false