我们有这些字符串:
如何确定字符串的数据类型?
在一段代码中?
答案 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