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 .
cwn*_*nja 25
只是正则表达它,它是微不足道的,除此之外不值得考虑:
v =~ /\A[-+]?[0-9]*\.?[0-9]+\Z/
Run Code Online (Sandbox Code Playgroud)
(根据贾斯汀的评论修正)
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)
rya*_*ogo 16
你可以添加一个:
validates_numericality_of :the_field
Run Code Online (Sandbox Code Playgroud)
在你的模型中.
请参阅:http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M002172
只需转换字符串两次:
num = '12'
num == num.to_i.to_s
#=> true
num = '3re'
num == num.to_i.to_s
#=> false
Run Code Online (Sandbox Code Playgroud)
我会建议这个
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)
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)