检查字符串是否仅包含Ruby中用逗号分隔的浮点数

时间:2014-02-19 20:58:35

标签: ruby regex string

如何检查字符串是否仅包含由逗号分隔且没有空格的浮点数。 如下所示:

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.

3 个答案:

答案 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