2013-07-09 133 views
0

给定用户输入的字符串,如果字符串是有效的int,我想将其转换为FixnumInteger。如果字符串是一个浮点数,我不想转换为int。如果失败,我然后想尝试将字符串转换为Float。如果字符串不是这些中的任何一个,我打算提出异常。将字符串转换为Float或Fixnum

看来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

1.4e5是Ruby中的一个有效数字 - 您是否特别想要不使用简写的数字? –

+0

@ChrisHeald我想尝试将float转换为int来引发异常。我认为萨瓦的答案是我需要的。 –

回答

7
def int_then_float string 
    Integer(string) 
rescue ArgumentError 
    Float(string) 
end 
+3

请'救援ArgumentError',真的没有必要去拯救那里的每一个可能的错误。 –

+0

@JörgWMittag谢谢你的建议。 – sawa

-1

.to_f或.to_f定义不会抛出错误,如果他们不能转换的字符串返回0 可以使用clases整数和Float。

这个方法返回引发的错误或浮数,如果第一个可以转换为整数

def validate_number(string) 
    begin 
    Integer(string) 
    Float(string) 
    rescue => e 
    e 
    end 
end 
+0

为什么回应不好? – rderoldan1

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 
+0

男人,随时投我一下,但请留下评论,以便我可以学习一些东西,如果我错了。 –

+1

你为什么不喜欢营救?这对我来说很痛苦。 – DrMavenRebe

+0

@DrMavenRebe,营救绝对有用,但我不认为这是一个正确的情况,当你可以使用简单的条件。首先救援需要更多的系统资源,其次在语义上,这不是一个例外/错误,为什么要拯救一个非错误? –

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 
相关问题