Chcę po prostu sprawdzić, czy zwracana wartość z pola tekstowego formularza to liczba, tj .: 12, 12,5 lub 12,75. Czy istnieje prosty sposób, aby to sprawdzić, zwłaszcza jeśli wartość jest pobierana jako param
?
ruby-on-rails
ruby
user211662
źródło
źródło
Odpowiedzi:
Po prostu powtórz to, jest to trywialne i nie warto o tym myśleć:
v =~ /\A[-+]?[0-9]*\.?[0-9]+\Z/
(Naprawiono zgodnie z komentarzem Justina)
źródło
v.to_s =~ /\A[-+]?\d*\.?\d+\z/
.Możesz użyć
12.is_a? Numeric
(
Numeric
będzie działać dla liczb całkowitych i zmiennoprzecinkowych).Jeśli pojawi się jako ciąg, który może zawierać reprezentację prawidłowej liczby, możesz użyć
class String def valid_float? true if Float self rescue false end end
a następnie
'12'.valid_float?
zwróci wartość true, jeśli możesz przekonwertować ciąg na prawidłową liczbę zmiennoprzecinkową (np. za pomocąto_f
).źródło
Fixnum
nie działa z pływakami. JednakNumeric
działa dobrze. Więc1.234.is_a? Fixnum == false
, ale1.234.is_a? Numeric == true
.1.1.is_a? Numeric
Zobacz stackoverflow.com/a/17668654/76486pry(main)> '12'.is_a? Numeric => false
'12'
to String. W takim przypadku sprawdź ciąg za pomocą Regex lub innego możliwego rozwiązania.Obecnie zwykle używam po prostu liczb Integer i 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
źródło
Możesz dodać:
validates_numericality_of :the_field
w swoim modelu.
Zobacz: http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M002172
źródło
Po prostu dwukrotnie przekonwertuj ciąg:
num = '12' num == num.to_i.to_s #=> true num = '3re' num == num.to_i.to_s #=> false
źródło
"7" == "7".to_f.to_s #=> false
(„7” vs „7,0”)num == num.to_i.to_s || num == num.to_f.to_s
Sugerowałbym ten
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
źródło
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
źródło
Wartości ciągów zawsze są konwertowane na 0 z .to_i
[14] pry(main)> 'Apple'.to_i > 0 => false [15] pry(main)> '101'.to_i > 0 => true
źródło