2016-09-28 41 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

あなたは、文字列が数字のみが含まれている場合、それはtruthyだろう次

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

を試すことができます。

+0

これはスマートです。また、あなたの答えのバリエーションと@ Stefanの提案である 'string.scan(/^\ d + $ /)any?'を読むこともできます。 –

+0

私にとっては、今のところ答えは一目瞭然です;)非永遠の記号を探しています。 1つではない - チェックが合格した場合。 – 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

単に '/^\ d + $ /'や '/ \ A \ d + \ z /'だけではなく、なぜ 'string = '0' 'では動かないでしょうか? – 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 
関連する問題