对于网络编程,数字以字符串形式出现。但是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
是否有更简洁,更自然的Ruby方式来完成此转换并检测到该字符串不是一个数字?
答案 0 :(得分:81)
使用整数(字符串)
如果字符串无法转换为整数,则会引发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
这将以您期望的方式运作。
答案 1 :(得分:5)
至少从Ruby 2.6开始,内核函数Integer,Float等接受执行该工作的exception
关键字参数:
> Integer('42', exception: false)
=> 42
> Integer('x42', exception: false)
=> nil
> Integer('x42')
ArgumentError (invalid value for Integer(): "x42")
> Integer('', exception: false)
=> nil
> Integer('')
ArgumentError (invalid value for Integer(): "")
> Integer(nil, exception: false)
=> nil
> Integer(' 42 ', exception: false)
=> 42
> Integer(' 4 2 ', exception: false)
=> nil
答案 2 :(得分:0)
使用简单的正则表达式检查str
是否为整数。
def number_or_nil(str)
str.to_i if str[/^-?\d+$/] and str.line.size == 1
end