严格将字符串转换为整数(或零)

时间:2014-07-27 11:05:50

标签: ruby type-conversion

对于网络编程,数字以字符串形式出现。但是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方式来完成此转换并检测到该字符串不是一个数字?

3 个答案:

答案 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