对于网络编程,数字以字符串的形式出现.但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

这将按你预期的方式工作.

Ruby相关问答推荐

如何使用Ruby中的时区函数S标准库?

从同名方法调用 ruby​​ 中的方法

在Ruby中将嵌套哈希键从CamelCase转换为snake_case

如何从 Ruby 中的线程返回值?

在 Ruby 中生成一个后台进程

我如何 expect期望在 RSpec 中引发异常的东西?

如何判断我是从 JRuby 还是 Ruby 运行?

Ruby 中方法名称的限制是什么?

Ruby中的常量或类变量?

如何从 SystemStackError 中获取回溯:堆栈级别太深?

如何在 ruby​​ 中进行命名捕获

to_proc 方法是什么意思?

判断字符串是否为空的Ruby方法?

如何在 Ruby 中取消定义类?

如何在 jekyll markdown 博客中包含视频

从Ruby中的子类方法调用父类中的方法

如何在 IRB 中重新加载脚本?

从 'mm/dd/yyyy' 格式解析 ruby​​ DateTime

如何在 Mac OS Sierra 10.12 上安装 Nokogiri

判断文件名是文件夹还是文件