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
- 它没有以
is_
为前缀。 我发现在问题"04".integer?
方法上很愚蠢,我喜欢"04".integer?
比"foo".is_integer?
。 - 它使用sepp2k的合理解决scheme,通过
"01"
等。 - 面向对象的,耶。
我更喜欢:
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?
是一个疑问句,应该返回true
或false
。 -
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