對於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的自然的方式?
對於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的自然的方式?
使用整型(字符串)
這將引發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
這工作,你所期望的方式。
使用簡單的正則表達式來檢查str
是一個整數。
def number_or_nil(str)
str.to_i if str[/^-?\d+$/] and str.line.size == 1
end
由於輸入來自網絡,你應該改變你的答案,線內容。 str.to_i if str [/ \ A \ d + \ z /] –
負整數,空白? –
修正了它。我檢查期望嚴格的規則整數,沒有空格,沒有換行符。 – hakcho
''5''應該是'5'還是'nil'? –
問題不清楚。 'to_i'有什麼問題?什麼是「這種轉換」? – sawa
nil是我所期望的,儘管我可能與5一起生活。 –