0

给定来自用户输入的字符串,我想将其转换为 aFixnum或者Integer该字符串是否为有效的 int。如果字符串是浮点数,我不想转换为 int。如果失败,我想尝试将字符串转换为Float. 如果字符串不是其中任何一个,我打算只引发一个异常。

似乎String#to_i只是截断任何Float值而不是提供任何类型的错误。我知道我可以做一些正则表达式来确定 a 是否是有效的 int,但如果 a有数字以外的任何内容String,似乎应该有一些内置的转换失败。String我错过了什么吗?

例如。我想要这样的失败而不是返回1

irb(main):092:0> "1.4".to_i
=> 1
irb(main):093:0> "1.4e5".to_i
=> 1
4

4 回答 4

7
def int_then_float string
  Integer(string)
rescue ArgumentError
  Float(string)
end
于 2013-07-09T17:19:32.967 回答
2

我的解决方案

def typing(value)
  if value.to_i.to_s == value
    value.to_i
  elsif value.to_f.to_s == value
    value.to_f
  else
    value
  end
end
于 2016-11-01T09:08:36.307 回答
0

我不喜欢救援所以这是我的版本:)

def to_fi(str)
  if str.to_i == str.to_f
    str.to_i
  else
    str.to_f
  end
end

a = "1"
to_fi a
#=> 1

a = "1.0"
to_fi a
#=> 1

a = "1.2"
to_fi a
#=> 1.2
于 2013-07-09T17:49:18.427 回答
-1

根据定义,.to_f 或 .to_f 永远不会引发错误,如果它们无法转换字符串,则返回 0。您可以使用 Integer 和 Float 类。

如果首先可以转换为整数,则此方法返回引发的错误或浮点数

def validate_number(string)
   begin
    Integer(string)
    Float(string)
   rescue => e
    e
   end
end 
于 2013-07-09T17:32:15.003 回答