Rubyで文字列と数値(数値を表す文字列)が混在しているデータを、本来数値だった物は数値型にし、文字列はそのままにする方法を調べたのでメモ。

なんかそういう便利なメソッドがあるのかなー?と思ったら無いみたい。なので、これもStringクラスを拡張してやってみる。

class String
  def str_int?
    Integer(self)
  rescue
    self
  end
end

p "123".str_int?  #=> 123
p "1d".str_int?   #=> "1d"
p "_123".str_int? #=> "_123"
p "123_".str_int? #=> "123_"
p "0".str_int?    #=> 0
p ".0".str_int?   #=> ".0"
p "1.0".str_int?  #=> "1.0"
p "0.0".str_int?  #=> "0.0"
foo = 0
p foo.str_int?    #=> undefined method `str_int?' for 0:Fixnum (NoMethodError)

当然だけど最初から数値のデータはStringクラスじゃないからundefined method。

で、1.0や0.0といった小数を含む数値データは、Integer(str)だと文字列に判別されるみたい。もしも小数を含む数値データも数値型にしたい場合はFloat(str)を使えばいいみたい。

class String
  def str_int?
    Float(self)
  rescue
    self
  end
end

p "123".str_int?  #=> 123.0
p "1d".str_int?   #=> "1d"
p "_123".str_int? #=> "_123"
p "123_".str_int? #=> "123_"
p "0".str_int?    #=> 0.0
p ".0".str_int?   #=> 0.0
p "1.0".str_int?  #=> 1.0
p "0.0".str_int?  #=> 0.0

今回の自分の場合は整数しか使う予定がないので、Integer(str)で良さそうだ。