Sar*_*Mei 158
嗯,这是简单的方法:
class String
def is_integer?
self.to_i.to_s == self
end
end
>> "12".is_integer?
=> true
>> "blah".is_integer?
=> false
Run Code Online (Sandbox Code Playgroud)
编辑:我不同意引发转换字符串异常的解决方案 - 异常不是控制流,你也可以采用正确的方式.也就是说,我上面的解决方案不涉及非基数为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
Run Code Online (Sandbox Code Playgroud)
Rad*_*ado 132
您可以使用正则表达式.这是@ janm建议的功能.
class String
def is_i?
!!(self =~ /\A[-+]?[0-9]+\z/)
end
end
Run Code Online (Sandbox Code Playgroud)
根据@wich的评论编辑的版本:
class String
def is_i?
/\A[-+]?\d+\z/ === self
end
end
Run Code Online (Sandbox Code Playgroud)
如果您只需要检查正数
if !/\A\d+\z/.match(string_to_check)
#Is not a positive number
else
#Is all good ..continue
end
Run Code Online (Sandbox Code Playgroud)
sep*_*p2k 64
您可以使用Integer(str)并查看它是否会引发:
def is_num?(str)
!!Integer(str)
rescue ArgumentError, TypeError
false
end
Run Code Online (Sandbox Code Playgroud)
附录:应该指出的是,虽然这确实是真的"01",但它并不适用"09",因为它09不是一个有效的整数文字.
补遗附录:通过改变这个固定10到Integer,按照@杰森- axelson的评论.
小智 24
"12".match(/^(\d)+$/) # true
"1.2".match(/^(\d)+$/) # false
"dfs2".match(/^(\d)+$/) # false
"13422".match(/^(\d)+$/) # true
Run Code Online (Sandbox Code Playgroud)
Rob*_*mme 23
你可以做一个班轮:
str = ...
int = Integer(str) rescue nil
if int
int.times {|i| p i}
end
Run Code Online (Sandbox Code Playgroud)
甚至
int = Integer(str) rescue false
Run Code Online (Sandbox Code Playgroud)
根据您尝试的操作,您还可以直接使用带有rescue子句的begin end块:
begin
str = ...
i = Integer(str)
i.times do |j|
puts j
end
rescue ArgumentError
puts "Not an int, doing something else"
end
Run Code Online (Sandbox Code Playgroud)
Tim*_*try 12
Ruby 2.6.0允许在不引发异常的情况下强制转换为整数,并且nil如果强制转换失败将返回。并且由于nil其行为与falseRuby 相似,因此您可以轻松地检查整数,如下所示:
if Integer(my_var, exception: false)
# do something if my_var can be cast to an integer
end
Run Code Online (Sandbox Code Playgroud)
class String
def integer?
Integer(self)
return true
rescue ArgumentError
return false
end
end
Run Code Online (Sandbox Code Playgroud)
is_.我发现在问号方法上很傻,我"04".integer?比它好多了"foo".is_integer?."01"等等.最好和最简单的方法是使用 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
Run Code Online (Sandbox Code Playgroud)
Integer也不错,但它会返回0为Integer nil
就我个人而言,我喜欢异常方法,尽管我会让它更简洁一些:
class String
def integer?(str)
!!Integer(str) rescue false
end
end
Run Code Online (Sandbox Code Playgroud)
然而,正如其他人已经指出的那样,这不适用于八进制字符串。
一个更简单的方法可能是
/(\D+)/.match('1221').nil? #=> true
/(\D+)/.match('1a221').nil? #=> false
/(\D+)/.match('01221').nil? #=> true
Run Code Online (Sandbox Code Playgroud)
我更喜欢:
配置/初始化/ string.rb
class String
def number?
Integer(self).is_a?(Integer)
rescue ArgumentError, TypeError
false
end
end
Run Code Online (Sandbox Code Playgroud)
然后:
[218] pry(main)> "123123123".number?
=> true
[220] pry(main)> "123 123 123".gsub(/ /, '').number?
=> true
[222] pry(main)> "123 123 123".number?
=> false
Run Code Online (Sandbox Code Playgroud)
或查看电话号码:
"+34 123 456 789 2".gsub(/ /, '').number?
Run Code Online (Sandbox Code Playgroud)