给定用户输入的字符串,如果该字符串是有效的int,我希望将其转换为Fixnum
或Integer
。如果该字符串为浮点值,我不希望转换为int。如果失败,我想尝试将字符串转换为Float
。如果字符串不是这两者中的任何一个,我只想引发一个异常。
似乎String#to_i
只是截断任何Float
值,而不是提供任何类型的错误。我知道我可以做一些正则化来确定String
是否是有效的int,但如果String
除了数字之外还有其他内容,那么似乎应该有一些内置的转换会失败。我是不是错过了什么?
例如。我想要这样失败的东西,而不是返回1
irb(main):092:0> "1.4".to_i
=> 1
irb(main):093:0> "1.4e5".to_i
=> 1
def int_then_float string
Integer(string)
rescue ArgumentError
Float(string)
end
我的解决方案
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
我不喜欢救援,所以这是我的版本:)
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
.to_f或.to_f根据定义永远不会引发错误,如果它们不能转换字符串,则返回0。可以使用"Integer"one_answers"Float"类。
如果第一个可以转换为整数,则此方法返回错误引发或浮点数
def validate_number(string)
begin
Integer(string)
Float(string)
rescue => e
e
end
end