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

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

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 = ",," # where value may only contains, integers, floats. 

如果以下匹配,则表示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 

这个正则表达式怎么样:

 str.split(',').all? {|val| val =~ /\A-?\d+(\.\d+)?\Z/} 

编辑:我认为问题的标题非常清楚,但显然不是,因为我现在看到字符串也可能包含整数。 是否允许使用负数是未说明的,但-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