

rubyで文字列を数値に変換する際、"100".to_i でやるかと思います。

"100a".to_iなど数値じゃない場合は、そこまでを変換し、  
もしくは"aa".to_iは0を返却する仕様かと思います。

そこを文字が含まれている場合はnilを返すようなメソッドを作りたいと思っています。

下記、コードのようにrescueで拾ってやると簡単にできそうですが、  
rescueを使わない方法はないでしょうか？あまりにもイケてないコードですので。。。

[code]

    Integer("aa") rescue nil
    
[/code]


CC BY-SA 3.0
2015-04-04T16:56:57.803
8768
2018-11-09T15:17:49.893
8475
question
ruby
Rubyで文字列を数値にするときにnilを返したい


rescueを使わない方法は無理に考えればなにかあるかもしれませんが、

[code]

    Integer(str) rescue nil
    
[/code]

はRubyを読み書きできる人ほとんど全員に明確に意図が通じる明瞭簡潔なコードなので、余計なことはしないほうがいいです。

公式リファレンスの[Time.parse](http://docs.ruby-
lang.org/ja/2.2.0/method/Time/s/parse.html)にも使用例があるように、後置rescueはこのような場合の一般的な使用法です。


CC BY-SA 3.0
2015-04-05T02:25:02.440
8774
2015-04-05T02:25:02.440
5793
8768
answer


`Integer(str) rescue nil`でメソッドを作ると、

[code]

    irb(main):009:0> def to_i(str)
    irb(main):010:1>   Integer(str) rescue nil
    irb(main):011:1> end
    => nil
    irb(main):012:0> to_i "a"
    => nil
    irb(main):013:0> to_i "10a"
    => nil
    irb(main):014:0> to_i "10"
    => 10
    
[/code]

↑このあたりまではよいのですが、

[code]

    irb(main):015:0> to_i "010"
    => 8
    irb(main):016:0> to_i "0x10"
    => 16
    
[/code]

↑このへんの動きがちょっと意図した挙動にならないかもしれません。

というわけで、正規表現とかで弾いてやるのが良いかなと思いました。

[code]

    irb(main):022:0> def to_i(str)
    irb(main):023:1>   str.to_i if str =~ /\A-?(?:\d|[1-9]\d+)\z/
    irb(main):024:1> end
    => nil
    irb(main):025:0> to_i "a"
    => nil
    irb(main):026:0> to_i "10a"
    => nil
    irb(main):027:0> to_i "10"
    => 10
    irb(main):028:0> to_i "0x10"
    => nil
    irb(main):029:0> to_i "010"
    => nil
    
[/code]

参考にしてみてください。


CC BY-SA 3.0
2015-04-05T05:14:30.933
8778
2015-04-05T07:41:03.863
2015-04-05T07:41:03.863
85
85
8768
answer

[code]

    str = "100a"
    str =~ /^[0-9]+$/ ? str.to_i : nil
    
[/code]


CC BY-SA 4.0
2018-11-09T15:17:49.893
50137
2018-11-09T15:17:49.893
30913
8768
answer