2014-02-19 49 views
0

如何檢查字符串是否只包含以逗號分隔的浮動數據,且沒有空格。 類似下面:檢查字符串是否只包含以逗號分隔的浮動數據庫中的紅寶石

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. 

回答

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

這個報告對像'str =「。,。,4,」''這樣的字符串有效。我不認爲這是正確的。 – Linuxios

+0

@Linuxios它取決於浮動的OP意味着什麼,以及在輸入中預期多少種類。 – sawa

+2

你有一點。我仍懷疑'.'或'4'是有效的輸入。 – Linuxios

2

怎麼樣這個正則表達式:

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

感謝這個工程,但不是隻有一個整數。 – user3187131

+0

user3187131,請舉例說明它不起作用。 Linuxios,可能允許使用負數。 –

+0

@cary:完成。它現在應該處理它們。 – Linuxios

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 
相關問題