2014-07-27 45 views
30

對於Web編程,數字以字符串形式出現。但to_i"5abc"轉換爲5和​​到0,這兩個錯誤的答案。爲了捕捉這些,我寫道:嚴格將字符串轉換爲整數(或無)

def number_or_nil(s) 
    number = s.to_i 
    number = nil if (number.to_s != s) 
    return number 
end 

有一個整齊的,實現這一轉變,並檢測該字符串的目的不是爲一些更Ruby的自然的方式?

+0

''5''應該是'5'還是'nil'? –

+0

問題不清楚。 'to_i'有什麼問題?什麼是「這種轉換」? – sawa

+0

nil是我所期望的,儘管我可能與5一起生活。 –

回答

56

使用整型(字符串)

這將引發ArgumentError錯誤如果字符串不能轉換爲整數。

Integer('5abc') #=> ArgumentError: invalid value for Integer(): "5abc" 
Integer('5') #=> 5 

如果您希望行爲是當字符串無法轉換時返回nil,您仍然需要您的number_or_nil方法。

def number_or_nil(string) 
    Integer(string || '') 
rescue ArgumentError 
    nil 
end 

你應該小心從特定的例外中解救出來。裸露的救援(例如「救援零」)將從任何繼承於StandardError的錯誤中解救出來,並且可能會以您不期望的方式干擾您的程序的執行。 Integer()會引發一個ArgumentError,所以指定它。

如果你不想處理異常,只是喜歡你number_or_nil更短的版本,你可以利用隱含的返回值,並把它寫成:

def number_or_nil(string) 
    num = string.to_i 
    num if num.to_s == string 
end 

number_or_nil '5' #=> 5 
number_or_nil '5abc' #=> nil 

這工作,你所期望的方式。

+3

只有警告是'Integer(nil)'引發'TypeError',所以'Integer(string ||'')'更加一致。 – RocketR

+0

好點@RocketR! –

+1

我在哪裏可以找到(官方)「整數(字符串)」文檔?據我所知,在官方的[ruby'Integer'文檔]中沒有提及它(http://ruby-doc.org/core-2.2.3/Integer.html)。 – apepper

0

使用簡單的正則表達式來檢查str是一個整數。

def number_or_nil(str) 
    str.to_i if str[/^-?\d+$/] and str.line.size == 1 
end 
+0

由於輸入來自網絡,你應該改變你的答案,線內容。 str.to_i if str [/ \ A \ d + \ z /] –

+0

負整數,空白? –

+0

修正了它。我檢查期望嚴格的規則整數,沒有空格,沒有換行符。 – hakcho