2010-12-27 11 views
2

Rails 3で文字列strに正の浮動小数点数が含まれているかどうかを調べる最も簡単な方法は何ですか?それは次のように動作するはず文字列が数字かどうかを調べる方法は?

strはアクティブレコードモデルでは属性ではありません):

str = "123"   =>  true 
str = "123.456"  =>  true 
str = "0"   =>  true 
str = ""   =>  false 
str = "abcd"  =>  false 
str = "-123"  =>  false 
+0

浮動小数点数の場合はhttp://stackoverflow.com/questions/1034418/determine-if-a-string-is-a-valid-float-valueとhttp://stackoverflow.com/questions/の重複があります。 4282273/do-ruby-1-9-2-an-a-a-function/428229 9(整数の場合)。ところで、 '123'は浮動小数点数ではなく、整数です。 –

答えて

7

は、ここに1つのアイデアだ

class String 
    def nonnegative_float? 
    !!match(/\A\+?\d+(?:\.\d+)?\Z/) 
    end 
end 
+0

これは '.123'を許可しないことに注意してください。これはRubyリテラルの浮動小数点としては無効ですが、私はこれが一般的にユーザーの入力に発生する可能性があると考えています。 – Phrogz

+3

@Phrogz:残念ながら、OPの要求仕様は*信じられないほど*漠然としており、彼のテストカバレッジは厳密にはあまり良くないので、基本的に推測です。テストケースがないのに、 '' .123 ''が有効であると仮定します。テストケースがないにもかかわらず、 '' + 123 ''が有効で、' '123'' 'が有効でないと仮定します。より良い答えは、基本的により良い質問が必要です。 –

0

あなたが正規表現に対してそれを一致させることができます。すでに非負の浮動小数点数がどのように見えるかのかなり良いアイデアを持っているように見えるので、あなたもRegexpに対してそれを一致させることができ、

class String 
    def nonnegative_float? 
    Float(self) >= 0 
    rescue ArgumentError 
    return false 
    end 
end 

しかし:

str === /^\d+(\.\d+)?$/ 
+1

この正規表現は広すぎて、負の数だけでなく 'u suck d00d'のようなものも許しています。 – Phrogz

+0

あなたが正しいです、私は最初と最後のアンカーを追加するのを忘れました。今修正されました。 – edgerunner

関連する問題