Проверка, является ли переменная целым числом
есть ли у Rails 3 или Ruby встроенный способ проверить, является ли переменная целым числом?
например,
1.is_an_int #=> true
"[email protected]".is_an_int #=> false?
11 ответов:
можно использовать
is_a?метод>> 1.is_a? Integer => true >> "[email protected]".is_a? Integer => false >>
если вы хотите знать, является ли объект -
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@Беня указывает на недосмотр этого метода, имейте это в виду:
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's a .com" else puts "It's not" 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и как вы сейчас, 0 значение
falseyпоэтому его можно использовать в условных выражениях"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"Я нахожу это поведение весьма полезным, так как он будет использовать всю логику преобразования Ruby и часто в моей логике 0 случай используется как фальсификация в любом случае
EDIT
а только что узнал о темных делах... кажется, только если число находится в первой позиции, хотя
"12blah".to_i => 12
чтобы использовать ответ Алекса Д, используя уточнений:
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
У меня была аналогичная проблема, прежде чем пытаться определить, является ли что-то строкой или каким-либо числом вообще. Я пробовал использовать регулярное выражение, но это не является надежным для моего варианта использования. Вместо этого вы можете проверить класс переменной, чтобы увидеть, является ли он потомком числового класса.
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"
num = 2.0
Если num. is_a? String num = Float (num) rescue false end
new_num = Integer (num) rescue false
ставит num
ставит new_num
ставит num = = new_num
Comments