testing一下,如果一个string基本上是一个用Ruby引号的整数?

我需要一个函数,is_an_integer,在哪里

"12".is_an_integer? returns true "blah".is_an_integer? returns false 

我怎样才能做到这一点在ruby? 我会写一个正则expression式,但即时通讯假设有一个这样的帮手,我不知道

你可以使用正则expression式。 这里是@ janm的build议的function。

 class String def is_i? !!(self =~ /\A[-+]?[0-9]+\z/) end end 

根据来自@wich的评论编辑的版本:

 class String def is_i? /\A[-+]?\d+\z/ === self end end 

如果你只需要检查正数

  if !/\A\d+\z/.match(string_to_check) #Is not a positive number else #Is all good ..continue end 

那么,这是简单的方法:

 class String def is_integer? self.to_i.to_s == self end end >> "12".is_integer? => true >> "blah".is_integer? => false 

编辑:我不同意挑起exception转换string的解决scheme – exception不是控制stream,你也可以做正确的方式。 这就是说,我上面的解决scheme并不涉及非十进制整数。 所以,这里的方法,而不诉诸于例外:

  class String def integer? [ # In descending order of likeliness: /^[-+]?[1-9]([0-9]*)?$/, # decimal /^0[0-7]+$/, # octal /^0x[0-9A-Fa-f]+$/, # hexadecimal /^0b[01]+$/ # binary ].each do |match_pattern| return true if self =~ match_pattern end return false end end 

你可以使用Integer(str)查看是否引发:

 def is_num?(str) !!Integer(str) rescue ArgumentError, TypeError false end 

附录:应该指出的是,尽pipe这对于"01"来说是正确的,但对于"09"不是,因为09不会是有效的整数字面量。

你可以做一个class轮:

 str = ... int = Integer(str) rescue nil if int int.times {|i| pi} end 

甚至

 int = Integer(str) rescue false 

根据你正在尝试做什么,你也可以直接使用带有rescue子句的begin end block:

 begin str = ... i = Integer(str) i.times do |j| puts j end rescue ArgumentError puts "Not an int, doing something else" end 
 "12".match(/^(\d)+$/) # true "1.2".match(/^(\d)+$/) # false "dfs2".match(/^(\d)+$/) # false "13422".match(/^(\d)+$/) # true 
 class String def integer? Integer(self) return true rescue ArgumentError return false end end 
  1. 它没有以is_为前缀。 我发现在问题"04".integer?方法上很愚蠢,我喜欢"04".integer?"foo".is_integer?
  2. 它使用sepp2k的合理解决scheme,通过"01"等。
  3. 面向对象的,耶。

我更喜欢:

configuration/初始化/ string.rb

 class String def number? Integer(self).is_a?(Integer) rescue ArgumentError, TypeError false end end 

接着:

 [218] pry(main)> "123123123".number? => true [220] pry(main)> "123 123 123".gsub(/ /, '').number? => true [222] pry(main)> "123 123 123".number? => false 

或检查电话号码:

 "+34 123 456 789 2".gsub(/ /, '').number? 

我个人喜欢这个例外的方法,尽pipe我会让它变得有点特别。

 class String def integer?(str) !!Integer(str) rescue false end end 

然而,正如其他人已经表示,这不适用于八进制string…

  def isint(str) return !!(str =~ /^[-+]?[1-9]([0-9]*)?$/) end 

最好和简单的方法是使用Float

 val = Float "234" rescue nil Float "234" rescue nil #=> 234.0 Float "abc" rescue nil #=> nil Float "234abc" rescue nil #=> nil Float nil rescue nil #=> nil Float "" rescue nil #=> nil 

Integer也不错,但是Integer nil将返回0

可能不适合所有情况,但一个简单的

 "12".to_i => 12 "blah".to_i => 0 

也可能为一些做。

所以如果它是一个数字而不是0,它将返回一个数字。 如果它返回0它是一个string或0。

一个更简单的方法可能是

 /(\D+)/.match('1221').nil? #=> true /(\D+)/.match('1a221').nil? #=> false /(\D+)/.match('01221').nil? #=> true 

解:

 # /initializers/string.rb class String IntegerRegex = /^(\d)+$/ def integer? !!self.match(IntegerRegex) end end # any_model_or_controller.rb '12345'.integer? # true 'asd34'.integer? # false 

说明:

  • /^(\d)+$/是用于查找任何string中数字的正则expression式。 你可以在http://rubular.com/上testing你的正则expression式和结果。;
  • 我们将其保存在一个常量IntegerRegex以避免每次在方法中使用它时都会产生不必要的内存分配。
  • integer? 是一个疑问句,应该返回truefalse
  • match是一个string上的方法,匹配参数中给定的正则expression式,并返回匹配的值或nil
  • !!match方法的结果转换为等价的布尔值。
  • 在现有的String类中声明方法是monkey patching,它不会改变现有String函数中的任何内容,而只是添加另一个名为integer?方法integer? 在任何String对象上。

对于更广义的情况(包括带小数点的数字),可以尝试以下方法:

 def number?(obj) obj = obj.to_s unless obj.is_a? String /\A[+-]?\d+(\.[\d]+)?\z/.match(obj) end 

你可以在irb会话中testing这个方法:

 (irb) >> number?(7) => #<MatchData "7" 1:nil> >> !!number?(7) => true >> number?(-Math::PI) => #<MatchData "-3.141592653589793" 1:".141592653589793"> >> !!number?(-Math::PI) => true >> number?('hello world') => nil >> !!number?('hello world') => false 

有关这里涉及的正则expression式的详细解释,看看这篇博客文章 🙂

尽pipe应该避免显式使用case平等运算符,但正则expression式Regexp#===在这里看起来很干净:

 def integer?(str) /\A[+-]?\d+\z/ === str end integer? "123" # true integer? "-123" # true integer? "+123" # true integer? "a123" # false integer? "123b" # false integer? "1\n2" # false 

在@ rado上面的回答扩展也可以使用三元语句来强制返回真或假的布尔值,而不使用双重的爆炸。 诚然,双重逻辑否定版本更简洁,但可能难以阅读新手(像我一样)。

 class String def is_i? self =~ /\A[-+]?[0-9]+\z/ ? true : false end end 

一个class轮在string.rb

 def is_integer?; true if Integer(self) rescue false end 

你可以用is_a? 方法。 例如。 1.is_a? 整数将返回true

我不确定当问这个问题的时候是否有这个问题,但是…对于那些在这个post中绊倒的人,最简单的方法是

 var = "12" var.is_a?(Integer) # returns false var.is_a?(String) # returns true var = 12 var.is_a?(Integer) # returns true var.is_a?(String) # returns false 

.is_a? 将与任何对象工作!