如何确定字符串中的数字类型?

时间:2014-01-20 10:17:18

标签: ruby validation numeric

我们有这些字符串:

  • “1/2”
  • “1”
  • “0.9”
  • “B”
  • “0,9”

如何确定字符串的数据类型?

  • 有理数
  • 整数
  • 不是数字
  • 不是数字

在一段代码中?

3 个答案:

答案 0 :(得分:6)

{Rational => :to_r, Integer => :to_i, Float => :to_f }.each do |key, sym|
  ["1/2", "1", "0.9"].each do |item|
    puts "#{item} is #{key}" if item.send(sym).to_s == item
  end
end

#1/2 is a Rational
#1 is a Integer
#0.9 is a Float

对于“非数字”的情况,我认为很容易提升一点

答案 1 :(得分:2)

使用regular expressions更灵活,更安全的方法:

def parse(data)
  h = {
    "Float"    => /\A\d+\.\d+\Z/,
    "Integer"  => /\A\d+\Z/,
    "Rational" => /\A\d+\/\d+\Z/
  }

  h.each do |type, regex|
    return type if data.match regex
  end

  return "Not a number"
end

parse("1")   # => "Integer"
parse("1.2") # => "Float"
parse("1/2") # => "Rational"
parse("1,2") # => "Not a number"
parse("b")   # => "Not a number"

如果您希望它返回实际的类而不是字符串,您可以轻松地修改h哈希的键。

答案 2 :(得分:1)

使用内置验证器的内核来实现它的另一种方法,就像一个想法。

但是,我认为应该避免在异常上构建其功能的代码,而其他解决方案可能更受欢迎。

def determine_type x
 [:Integer, :Float, :Rational].each do |c|
   return c if send(c, x) rescue ArgumentError
 end
 return :String
end

p determine_type(1)     #=> :Integer
p determine_type('1')   #=> :Integer
p determine_type('1.0') #=> :Float
p determine_type('1/1') #=> :Rational
p determine_type('ccc') #=> :String