我需要一个函数,is_an_integer
,其中
"12".is_an_integer?
返回true."blah".is_an_integer?
返回false。我如何在Ruby中做到这一点?我会写一个正则表达式,但我假设有一个我不知道的帮助器。
发布于 2009-08-05 21:59:23
您可以使用正则表达式。以下是@janm建议的函数。
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
发布于 2009-08-05 21:35:27
好吧,这里有一个简单的方法:
class String
def is_integer?
self.to_i.to_s == self
end
end
>> "12".is_integer?
=> true
>> "blah".is_integer?
=> false
我不同意引发异常来转换字符串的解决方案-异常不是控制流,你最好用正确的方式来做。也就是说,我上面的解决方案没有处理非10进制的整数。因此,下面是不用求助于异常的方法:
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
发布于 2009-08-05 21:31:24
您可以使用Integer(str)
,并查看它是否会引发:
def is_num?(str)
!!Integer(str)
rescue ArgumentError, TypeError
false
end
应该指出的是,虽然这对于"01"
确实会返回true,但对于"09"
则不会,因为09
不是有效的整数文本。如果这不是您想要的行为,您可以将10
作为第二个参数添加到Integer
,这样这个数字总是被解释为基数10。
https://stackoverflow.com/questions/1235863
复制相似问题