如何检查值是否为数字?

use*_*662 77 ruby ruby-on-rails

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

Pet*_*ter 188

您可以使用

12.is_a? Numeric
Run Code Online (Sandbox Code Playgroud)

(Numeric适用于整数和浮点数.)

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

class String
  def valid_float?
    true if Float self rescue false
  end
end
Run Code Online (Sandbox Code Playgroud)

'12'.valid_float?如果你可以将字符串转换为有效的float(例如with to_f),则返回true .

  • ```Fixnum```似乎不适用于花车.但是,```Numeric```工作正常.那么```1.234.is_a?Fixnum == false```,但是```1.234.is_a?数字== true```. (10认同)
  • 不适合我:( `pry(main)> '12'.is_a? Numeric => false` (2认同)

cwn*_*nja 25

只是正则表达它,它是微不足道的,除此之外不值得考虑:

v =~ /\A[-+]?[0-9]*\.?[0-9]+\Z/
Run Code Online (Sandbox Code Playgroud)

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

  • 在ruby中,^和$表示一行的开头/结尾,而不是一个字符串.这使得无法用作消毒输入的手段(参见http://guides.rubyonrails.org/security.html#regular-expressions).更好的方法是:`v.to_s =〜/\A [ - +]?\ d*\.?\ d +\z /`. (5认同)

dae*_*esu 24

这些天我通常只使用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
Run Code Online (Sandbox Code Playgroud)

  • 在 ruby​​ 2.6 中,您还可以执行以下操作: `Integer('343', exception: false) # 343` 和 `Integer('fg5', exception: false) # nil` ``` (3认同)

rya*_*ogo 16

你可以添加一个:

validates_numericality_of :the_field
Run Code Online (Sandbox Code Playgroud)

在你的模型中.

请参阅:http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M002172


Eva*_*oss 6

只需转换字符串两次:

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

num = '3re'
num == num.to_i.to_s 
#=> false
Run Code Online (Sandbox Code Playgroud)


ins*_*ero 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
Run Code Online (Sandbox Code Playgroud)


Bri*_*ong 5

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
Run Code Online (Sandbox Code Playgroud)

  • "1.1" .is_a?数字=>假 (6认同)