2012-04-26 10 views
5

に変換する文字列とデフォルト値をとり、文字列が整数を表す場合は整数に変換するRubyメソッドがありますか?そうでない場合はデフォルト値を返します。Rubyの文字列をデフォルト値の

更新 私は、次の答えは望ましいと思う:ここ

class String 
    def try_to_i(default = nil) 
    /^\d+$/ === self ? to_i : default 
    end 
end 

は、あなたが例外を回避すべき理由証拠です:

> def time; t = Time.now; yield; Time.now - t end 

> time { 1000000.times { |i| ('_' << i.to_s) =~ /\d+/ } } 
=> 1.3491532 
> time { 1000000.times { |i| Integer.new('_' << i.to_s) rescue nil } } 
=> 27.190596426 
+0

「整数を含む」とはどういう意味ですか? –

+0

'"早すぎる最適化はすべての悪の根源です " - Donald Knuth – Reactormonk

答えて

2

あなた自身が、おそらく使用していることをコーディングする必要があります文字列を確認する正規表現:

def try_to_i(str, default = nil) 
    str =~ /^-?\d+$/ ? str.to_i : default 
end 
+0

負の数値はどうですか? – Reactormonk

+0

@Tass:それを指摘してくれてありがとう:) –

8

変換するのは#to_iInteger()です。最初の値のデフォルトは で、2番目の値はArgumentErrorです。

class String 
    def to_integer(default) 
    Integer(self) 
    rescue ArgumentError 
    default 
    end 
end 
+0

通常の使用例では例外を使用すると高性能オーバーヘッドになると思います – Alexey

+0

これはより洗練されたソリューションであり、受け入れられるはずです。私は 'Integer()'について知らなかったので、これを示唆していませんでした。 @Alexey:ジョブの正規表現を使用するオーバーヘッドはさらに問題があります。 –

+0

Niklas、質問の更新を参照してください – Alexey

-1

あなたはこのような何か行うことができます:

int_value = (stringVar.match(/^(\d+)$/) && $1.to_i) || default_value 

文字列が数字で完全に構成された場合に表示され、その場合、int型、またはデフォルト値を返すように変換します。

+0

Rubyは '?:'を持っていますので、なぜ信頼できない '&& ... || ...イディオム? –

+0

IMOでは、三項演算子を使用するのではなく、整数の大文字小文字を括弧内のブロックにバンドルする方が概念的には健全なようです。また、どのように&&/||信頼できない?確かに、記述された同等の演算子(と/または)の間を切り替えると優先順位の問題がありますが、一貫して使用するとそれがなくなります。すべてのことが言った、それはあなた次第です - もしあなたのスタイルに合っていれば、それに行きましょう。 –

+0

私は、 '&&'と '|| 'の間の部分が' false'または 'nil'になることがある場合、常に2度考える必要があるということを意味しました。この場合、それは条件演算子または' if ..それから.. else'。この場合、 'to_i'は常に整数値を返すので大丈夫です。ところで、かっこはあなたの例では必要ありません。 –

関連する問題