对于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一起生活。 –