Как я могу проверить, является ли значение числом? - PullRequest
75 голосов
/ 19 января 2010

Я хочу просто проверить, является ли возвращаемое значение из текстового поля формы числом, т. Е. 12, 12,5 или 12,75. Есть ли простой способ проверить это, особенно если значение выводится как param?

Ответы [ 8 ]

184 голосов
/ 19 января 2010

Вы можете использовать

12.is_a? Numeric

(Numeric будет работать для целых чисел и чисел с плавающей точкой.)

Если оно приходит в виде строки, которая может содержать представление действительного числа, вы можете использовать

class String
  def valid_float?
    true if Float self rescue false
  end
end

, а затем '12'.valid_float? вернет true, если вы можете преобразовать строку в допустимое число с плавающей точкой (например, с to_f).

24 голосов
/ 20 января 2010

Просто отыщите это, это тривиально, и не стоит думать об этом:

v =~ /\A[-+]?[0-9]*\.?[0-9]+\Z/

(исправлено согласно комментарию Джастина)

23 голосов
/ 02 июля 2013

В эти дни я обычно просто использую Integer и Float.

1.9.2p320 :001 > foo = "343"
 => "343"
1.9.2p320 :003 > goo = "fg5"
 => "fg5"

1.9.2p320 :002 > Integer(foo) rescue nil
 => 343
1.9.2p320 :004 > Integer(goo) rescue nil
 => nil

1.9.2p320 :005 > Float(foo) rescue nil
 => 343.0
1.9.2p320 :006 > Float(goo) rescue nil
 => nil
16 голосов
/ 19 января 2010

Вы можете добавить:

validates_numericality_of :the_field

в вашей модели.

См .: http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M002172

7 голосов
/ 15 октября 2016

Просто дважды преобразовать строку:

num = '12'
num == num.to_i.to_s 
#=> true 

num = '3re'
num == num.to_i.to_s 
#=> false
5 голосов
/ 16 июля 2013
irb(main):005:0> 1.1.is_a? Numeric
=> true
irb(main):006:0> 1.is_a? Numeric
=> true
irb(main):007:0> 'asd'.is_a? Numeric
=> false
5 голосов
/ 09 мая 2013

Я бы предложил это

def is_number?
  self.to_f == self
end

> 15.is_number?
=> true
> 15.0.is_number?
=> true
> 'Not a number'.is_number?
=> false
> (0/0.0).is_number?
=> false
0 голосов
/ 15 марта 2015

Строковые значения всегда преобразуются в 0 с помощью .to_i

[14] pry(main)> 'Apple'.to_i > 0
=> false

[15] pry(main)> '101'.to_i > 0
=> true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...