Есть ли у Rails 3 или Ruby встроенный способ проверить, является ли переменная целой?
Например,
1.is_an_int #=> true
"[email protected]".is_an_int #=> false?
Есть ли у Rails 3 или Ruby встроенный способ проверить, является ли переменная целой?
Например,
1.is_an_int #=> true
"[email protected]".is_an_int #=> false?
Вы можете использовать метод is_a?
>> 1.is_a? Integer
=> true
>> "[email protected]".is_a? Integer
=> false
>>
Если вы хотите узнать, является ли объект Integer
или что-то, что может быть цельно конвертировано в Integer (не включая такие вещи, как "hello"
, который to_i
будет конвертировать в 0
):
result = Integer(obj) rescue false
Используйте регулярное выражение для строки:
def is_numeric?(obj)
obj.to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? false : true
end
Если вы хотите проверить, является ли переменная определенного типа, вы можете просто использовать kind_of?
:
1.kind_of? Integer #true
(1.5).kind_of? Float #true
is_numeric? "545" #true
is_numeric? "2aa" #false
Если вы не уверены в типе переменной (это может быть строка с числовыми символами), скажем, это номер кредитной карты, переданный в параметры, поэтому она первоначально была бы строкой, но вы хотите убедиться у него нет буквенных символов, я бы использовал этот метод:
def is_number?(obj)
obj.to_s == obj.to_i.to_s
end
is_number? "123fh" # false
is_number? "12345" # true
@Benny указывает на недосмотр этого метода, помните об этом:
is_number? "01" # false. oops!
Там var.is_a? Class
(в вашем случае: var.is_a? Integer
); которые могут соответствовать законопроекту. Или там Integer(var)
, где он выдаст исключение, если он не сможет его разобрать.
Более "утиная типизация" заключается в использовании respond_to?
таким образом, могут использоваться также "целые" или "строковые" классы
if(s.respond_to?(:match) && s.match(".com")){
puts "It a .com"
else
puts "It not"
end
Вы можете использовать тройной равный.
if Integer === 21
puts "21 is Integer"
end
Если вам не нужно преобразовывать нулевые значения, я считаю методы to_i
и to_f
чрезвычайно полезными, поскольку они преобразуют строку либо в нулевое значение (если не конвертируемое или нулевое), либо в фактическое значение типа Integer
или Float
.
"0014.56".to_i # => 14
"0014.56".to_f # => 14.56
"0.0".to_f # => 0.0
"not_an_int".to_f # 0
"not_a_float".to_f # 0.0
"0014.56".to_f ? "I'm a float" : "I'm not a float or the 0.0 float"
# => I'm a float
"not a float" ? "I'm a float" : "I'm not a float or the 0.0 float"
# => "I'm not a float or the 0.0 float"
РЕДАКТИРОВАТЬ 2: будьте осторожны, целочисленное значение 0
не является ложным, это правда (!!0 #=> true
) (спасибо @prettycoder)
РЕДАКТИРОВАТЬ
Ах, только что узнал о темных случаях... кажется, что происходит только если номер в первой позиции, хотя
"12blah".to_i => 12
Чтобы использовать ответ Alex D, используя refinements
module CoreExtensions
module Integerable
refine String do
def integer?
Integer(self)
rescue ArgumentError
false
else
true
end
end
end
end
Позже, у вас класс:
require 'core_ext/string/integerable'
class MyClass
using CoreExtensions::Integerable
def method
'my_string'.integer?
end
end
У меня была аналогичная проблема, прежде чем пытаться определить, есть ли что-то строка или какой-либо номер. Я попытался использовать регулярное выражение, но это не является надежным для моего варианта использования. Вместо этого вы можете проверить класс переменной, чтобы узнать, является ли он потомком класса Numeric.
if column.class < Numeric
number_to_currency(column)
else
column.html_safe
end
В этой ситуации вы также можете заменить любого из числовых потомков: BigDecimal, Date:: Infinity, Integer, Fixnum, Float, Bignum, Rational, Complex
Вероятно, вы ищете что-то вроде этого:
Примите "2.0 или 2.0 как INT, но отклоните 2.1 и" 2.1 "
число = 2,0
если num.is_a? String num = Float (num) спасение ложного конца
new_num = Integer (num) спасение false
ставит num
ставит new_num
ставит num == new_num