如何检查字符串是否仅包含由逗号分隔且没有空格的浮点数。 如下所示:
str = "0.0687987167581341,0.120311605902415,89.8399554017928,198.151088713489" #true
str = "0.068798716758f1341,0.120311605902415, 89.8399554017928,198.151088713489" #False because of "f" in the first value.
str = "0.0687987167581341 0.120311605902415" # False because of no space and comma.
基本上,我如何检查字符串是否在下面的表格中:
str = "<value>,<value>,<value>" # where value may only contains, integers, floats.
答案 0 :(得分:2)
这个正则表达式怎么样:
str.split(',').all? {|val| val =~ /\A-?\d+(\.\d+)?\Z/}
答案 1 :(得分:1)
如果以下匹配,则表示str
不满足条件。
str =~ /[^\d.,]/
所以,取消否定:
re = /[^\d.,]/
"0.0687987167581341,0.120311605902415,89.8399554017928,198.151088713489" !~ re
# => true
"0.068798716758f1341,0.120311605902415, 89.8399554017928,198.151088713489" !~ re
# => false
"0.0687987167581341 0.120311605902415" !~ re
# => false
答案 2 :(得分:1)
编辑:我认为问题的标题非常清楚,但显然不是,因为我现在看到字符串也可能包含整数。是否允许使用否定数字是未说明的,但-2.1
是浮点数,-3
是整数。无论如何,我的解决方案只适用于浮点数,虽然修改它以允许整数并不困难,但这样做太麻烦了。
我更喜欢@Linuxios的解决方案,但为了多样性,我会提到另一种方法。如果我们不关心额外前导或尾随零的可能性,这应该有效:
str = "0.0687987167581341,0.120311605902415,89.8399554017928,198.151088713489"
str.split(',').all? { |s| s.to_f.to_s == s.strip }
#=>true
如果有额外的前导或尾随零或额外的空格,我相信这会有效:
str.split(',').all? {|s| s.to_f.to_s ==
s.match(/^\s*(-)?\s*?0*?(0.\d+?|[1-9]\d*\.\d+?)0*\s*$/)[1..-1].join