Это только стоит усилия, если это приносит Вам практическую пользу. Придерживание стандартов могло бы облегчить создавать веб-сайт, который работает через большинство браузеров. С другой стороны, если Вы довольны тем, как веб-сайт отображается на браузерах, о которых Вы заботитесь (возможно, один, возможно, все), затем проходить обручи, чтобы заставить его передать проверку является пустой тратой времени.
кроме того, различие в SEO между все-допустимым веб-сайтом HTML и главным образом допустимым веб-сайтом HTML незначительно.
Поэтому всегда ищут практическое преимущество, существуют некоторые в некоторых ситуациях, но не делают этого только ради него.
Вы можете использовать регулярные выражения. Вот функция с предложениями @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
class String
def integer?
Integer(self)
return true
rescue ArgumentError
return false
end
end
is_
. Я нахожу это глупым в методах вопросительного знака, мне нравится "04" .integer?
намного лучше, чем "foo" .is_integer?
. "01"
и т. д. Вы можете использовать однострочник:
str = ...
int = Integer(str) rescue nil
if int
int.times {|i| p i}
end
или даже
int = Integer(str) rescue false
В зависимости от того, что вы пытаетесь сделать, вы также можете напрямую использовать начальный конечный блок с предложением восстановления:
begin
str = ...
i = Integer(str)
i.times do |j|
puts j
end
rescue ArgumentError
puts "Not an int, doing something else"
end
Вот простой способ:
class String
def is_integer?
self.to_i.to_s == self
end
end
>> "12".is_integer?
=> true
>> "blah".is_integer?
=> false
Я не согласен с решениями, которые вызывают исключение для преобразования строки - исключения не являются потоком управления, и вы также можете сделать это правильно. Тем не менее, мое вышеприведенное решение не касается целых чисел, отличных от десятичной. Итак, вот способ обойтись, не прибегая к исключениям:
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
Следует отметить, что пока это возвращает верно для «01»
, но не для «09»
просто потому, что 09
не будет допустимым целочисленным литералом. Если это не то поведение, которое вам нужно, вы можете добавить 10
в качестве второго аргумента к Integer
, чтобы число всегда интерпретировалось как основание 10.