はちゅにっき

こっちのブログはまったり更新

Ruby で is_numeric

PHP の is_numeric( ) みたいなのを Ruby でやる場合はこんな感じでいいのかなー?

def numeric? (value)
  return true if value.kind_of?(Numeric)
  !!(Integer(value) rescue Float(value)) rescue false
end

これで、以下のようにテストしてみたら、だいたい OK な気がする。

require 'minitest/autorun'

class TestNumeric < Minitest::Test
  def test_numeric
    assert_equal(true, numeric?(1))
    assert_equal(true, numeric?('2'))
    assert_equal(true, numeric?('3.4'))
    assert_equal(true, numeric?('-5'))
    assert_equal(true, numeric?('-6.7'))
    assert_equal(false, numeric?('Infinity'))
    assert_equal(false, numeric?('Float::INFINITY'))
    assert_equal(true, numeric?(Float::INFINITY))
    assert_equal(false, numeric?('1abc'))
    assert_equal(false, numeric?('def2.3'))
    assert_equal(true, numeric?('0x1f'))
    assert_equal(false, numeric?('0xfg'))
    assert_equal(false, numeric?('0b1a'))
    assert_equal(true, numeric?('0b1011'))
    assert_equal(true, numeric?('2.0e-10'))
    assert_equal(true, numeric?('-2.0e10'))
  end
end

場合によっては本当は false になって欲しいような部分もありそうだけど、どうでしょう?