2014-07-27 42 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