如何检查值是否为数字?


82

我只想检查表单文本字段中返回的值是否为数字,即:12,12.5或12.75。有没有一种简单的方法来检查这一点,特别是如果将值拉为param?的话?


嗯,唯一的是代码适用于is_a_number吗?唯一的例外是0.02,或.3号工程....
user211662

7
我非常喜欢这种解决方案:stackoverflow.com/questions/5661466 / ...我不知道为什么这么多人认为使用正则表达式会更好。
2call-chaos 2013年

Answers:


26

只是对它进行正则表达式,这是微不足道的,不值得考虑:

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

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


5
在ruby中,^和$表示行的开头/结尾,而不是字符串。这使得这种方法无法有效地用于清理输入内容(请参阅guides.rubyonrails.org/security.html#regular-expressions)。更好的方法是:v.to_s =~ /\A[-+]?\d*\.?\d+\z/
贾斯汀

204

您可以使用

12.is_a? Numeric

Numeric适用于整数和浮点数。)

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

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

'12'.valid_float?如果可以将字符串转换为有效的浮点数(例如,使用to_f),则返回true 。


抱歉,这是Ruby on Rails ...基本上,我只是想能够评估用户的任何输入是否为.03 0.3,2.2后两项工作,但是我需要使第一个输入工作:S
user211662'1

10
Fixnum似乎不适用于浮点数。但是,Numeric工作正常。所以1.234.is_a? Fixnum == false,但是1.234.is_a? Numeric == true
KurtPreston

这不适用于浮点数。应该使用1.1.is_a? Numeric请参阅stackoverflow.com/a/17668654/76486
Brian Armstrong

1
不为我工作:(pry(main)> '12'.is_a? Numeric => false
Salil

@Salil显然不是'12'一个字符串,它对您不起作用。在这种情况下,请使用Regex或任何其他可能的解决方案检查字符串。
edmundo096

27

这些天我通常只使用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


7

只需将字符串转换两次:

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

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

工作不是整数那么糟糕,但有这么多的方法,如果你想跟随花车这一建议(这是个问题问怎么样)失败: "7" == "7".to_f.to_s #=> false(“7”与“7.0”)
大卫Stosik

您可以做num == num.to_i.to_s || num == num.to_f.to_s
mannykary

您还可以使用“%”运算符设置两个字符串的格式,以确保它们都以相同的字符串结尾
Jaacko Torus

5

我建议这个

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

4
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

6
“ 1.1” .is_a?数值=>假
将于2016年

您将如何解决字符串转换问题?OP指出它来自文本字段。
schlingel

-5

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

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

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

那么边缘情况呢?如果数字为0或负数,则您的测试将给出错误的负数。
tsikov

更糟糕的是'1AB2'.to_i对于明显不是整数的东西将返回1
Thomas Bindzus 15'Aug
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.