Ruby on rails 如何检查值是否为数字?

Ruby on rails 如何检查值是否为数字?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我只想检查表单文本字段返回的值是否是数字,即:12、12.5或12.75。是否有一种简单的方法来检查这一点,特别是当值作为参数拉取时?您可以使用 12.is_a? Numeric (Numeric适用于整数和浮点。) 如果它以可能包含有效数字表示形式的字符串的形式到达,则可以使用 class String def valid_float? true if Float self rescue false end end 然后'12'。如果您可以将字符串转换为有效浮点(例如,使用

我只想检查表单文本字段返回的值是否是数字,即:12、12.5或12.75。是否有一种简单的方法来检查这一点,特别是当值作为
参数拉取时?

您可以使用

12.is_a? Numeric
Numeric
适用于整数和浮点。)

如果它以可能包含有效数字表示形式的字符串的形式到达,则可以使用

class String
  def valid_float?
    true if Float self rescue false
  end
end
然后
'12'。如果您可以将字符串转换为有效浮点(例如,使用
转换为\u f
),则有效浮点?
将返回true。

您可以添加:

validates_numericality_of :the_field
在你的模型中


请参阅:

只需对其进行regexp,它很琐碎,除此之外不值得考虑:

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

(根据贾斯汀的评论进行了修正)

我建议这一个

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

现在我通常只使用整数和浮点

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

字符串值始终使用.to_i转换为0

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

[15] pry(main)> '101'.to_i > 0
=> true

只需将字符串转换两次:

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

num = '3re'
num == num.to_i.to_s 
#=> false

嗯,唯一的一点是,这个代码适用于is_a_数字?唯一的例外是.02或.3数字…我更喜欢这个解决方案:我不知道为什么这么多人认为regexp会更好。对不起,这是Ruby on Rails。。。基本上,我只想能够评估用户的任何输入,不管它是.03 0.3、2.2后两种,但我需要让第一个输入工作:S
Fixnum
似乎不适用于浮点数。但是,
Numeric
工作正常。那么
1.234.u是a吗?Fixnum==false
,但是
1.234.a?Numeric==true
。这不适用于浮点数。应该使用
1.1.a吗?数字
请参阅不为我工作:(
pry(主)>“12.”是否为?Numeric=>false
@Salil显然这对您不起作用,
'12'
是一个字符串。在这种情况下,请使用正则表达式或任何其他可能的解决方案检查字符串。在ruby中,^和$表示行的开始/结束,而不是字符串的结束。这使得它无法用作清理输入的手段(请参阅)。更好的方法是:
v.to\u s=~/\A[-+]?\d*\.?\d+\z/
。边缘情况如何?如果数字为0或负值,您的测试将给出假阴性。更糟糕的是“1AB2”。对于\u,我将返回1,表示明显不是整数的东西……”1.1.is_a?Numeric=>false您如何处理字符串转换问题?OP声明它来自文本字段。对于整数来说效果不错,但如果您想使用浮点数遵循此建议(这就是问题的问题所在):
“7”==“7”。to_f.to_s#=>false
(“7”vs“7.0”)您可以执行
num==num.to_i.to_s | | num==num.to_f.to_s
您还可以使用“%”运算符格式化两个字符串,以确保它们都以相同的字符串结尾
num = '12'
num == num.to_i.to_s 
#=> true 

num = '3re'
num == num.to_i.to_s 
#=> false