给定来自用户输入的字符串,如果字符串是有效的int,我想将其转换为Fixnum
或Integer
。如果字符串是float,我不想转换为int。如果失败,我想尝试将字符串转换为Float
。如果字符串不是其中任何一个,我打算只引发异常。
似乎String#to_i
只截断任何Float
值,而不是提供任何类型的错误。我知道我可以做一些regexing以确定String
是否是一个有效的int,但是如果String
有其他任何数字,似乎应该有一些内置转换失败。我错过了什么吗?
例如。我想要这样的东西失败而不是返回1
irb(main):092:0> "1.4".to_i
=> 1
irb(main):093:0> "1.4e5".to_i
=> 1
答案 0 :(得分:7)
def int_then_float string
Integer(string)
rescue ArgumentError
Float(string)
end
答案 1 :(得分:1)
我的解决方案
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
答案 2 :(得分: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
答案 3 :(得分:-1)
.to_f或.to_f永远不会引发错误,如果他们无法转换字符串返回0。 您可以使用Integer和Float。
如果首先可以转换为整数
,则此方法返回引发的错误或浮点数def validate_number(string)
begin
Integer(string)
Float(string)
rescue => e
e
end
end