对于网络编程,数字以字符串的形式出现.但to_i
会将"5abc"
转换为5
,"abc"
转换为0
,这两个答案都是错误的.为了抓住这些,我写道:
def number_or_nil( s )
number = s.to_i
number = nil if (number.to_s != s)
return number
end
有没有一种更简洁、更自然的方式来完成这种转换,并检测出字符串不是数字?
对于网络编程,数字以字符串的形式出现.但to_i
会将"5abc"
转换为5
,"abc"
转换为0
,这两个答案都是错误的.为了抓住这些,我写道:
def number_or_nil( s )
number = s.to_i
number = nil if (number.to_s != s)
return number
end
有没有一种更简洁、更自然的方式来完成这种转换,并检测出字符串不是数字?
使用整数(字符串)
如果字符串无法转换为整数,则会引发ArgumentError错误.
Integer('5abc') #=> ArgumentError: invalid value for Integer(): "5abc"
Integer('5') #=> 5
如果希望在字符串无法转换时返回nil,那么仍然需要number_或_nil方法.
def number_or_nil(string)
Integer(string || '')
rescue ArgumentError
nil
end
你应该小心避免特殊情况.一个简单的解救(例如"解救零")将解救从StandardError继承的任何错误,并可能以您意想不到的方式干扰程序的执行.Integer()将引发ArgumentError,因此请指定.
如果您不想处理异常,只想使用较短版本的数字_或_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
这将按你预期的方式工作.