2016-09-28 69 views
2

我有一個字符串作爲參數傳遞給函數。在這裏,我想檢查一下字符串是否只包含數字。於是我做了一個檢查象下面這樣:檢查一個字符串是否只包含紅寶石數字

def check_string(string) 
    result = false 
    if string.to_i.to_s.eql? string 
    result = true 
    end 
    result 
end 

但是,當一個字符串0。在這種情況下開始出現問題,一個返回false。

check_string('123') #=> true 
check_string('0123') #=> false 

我該如何解決這個問題?

+0

如果字符串爲空應該怎麼回來了? – Stefan

+0

另請參閱http://stackoverflow.com/questions/5661466/test-if-string-is-a-number-in-ruby-on-rails/5661695 –

回答

12

你可以嘗試以下

def check_string(string) 
    string.scan(/\D/).empty? 
end 

這將是truthy如果字符串僅包含數字。

+0

這很聰明。你也可以使用你的答案和@ Stefan的建議'string.scan(/^\ d + $ /)。any?',我認爲這很好。 –

+0

至於我現在的答案是更多的首先看起來可以理解;)只是尋找nondigit符號。如果沒有一個 - 支票已通過。 – Aleksey

1

您可以使用正則表達式爲它:

def check_string(string) 
    raise 'Empty string passed' if string.empty? 

    /\A\d+\z/ === string 
end 

check_string '123' 
#=> true 
check_string '0123' 
#=> true 
check_string '0' 
#=> true 
+1

對'string ='0''不起作用 - 爲什麼不簡單地使用'/^\ d + $ /'或'/ \ A \ d + \ z /'? – Stefan

+0

@Stefan'/^\ d + $ /'非常有意義! –

+2

@AndreyDeineko由於你的正則表達式在這裏匹配,所以失敗了字符串「foobar \ n123」的前提。你實際上想要使用'/ \ A \ d + \ z /'。 –

1
def check_string(str) 
    str !~ /\D/ 
end 

check_string '123' 
    #=> true 
check_string '' 
    #=> true 
check_string '1a2' 
    #=> false 

另一種方式:

def check_string(str) 
    return true if str.empty? 
    str.to_i.to_s == str 
end 

check_string '123' 
    #=> true 
check_string '' 
    #=> true 
check_string '1a2' 
    #=> false 
相關問題