2013-07-09 132 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 
相關問題