Ich möchte einfach überprüfen, ob ein zurückgegebener Wert aus einem Formulartextfeld eine Zahl ist, dh: 12, 12.5 oder 12.75. Gibt es eine einfache Möglichkeit, dies zu überprüfen, insbesondere wenn der Wert als gezogen wird param
?
ruby-on-rails
ruby
user211662
quelle
quelle
Antworten:
Regexp es einfach, es ist trivial und es lohnt sich nicht darüber nachzudenken:
v =~ /\A[-+]?[0-9]*\.?[0-9]+\Z/
(Behoben gemäß Justins Kommentar)
quelle
v.to_s =~ /\A[-+]?\d*\.?\d+\z/
.Sie können verwenden
12.is_a? Numeric
(
Numeric
funktioniert für Ganzzahlen und Gleitkommazahlen.)Wenn es als Zeichenfolge ankommt, die möglicherweise eine Darstellung einer gültigen Zahl enthält, können Sie es verwenden
class String def valid_float? true if Float self rescue false end end
und gibt dann
'12'.valid_float?
true zurück, wenn Sie die Zeichenfolge in einen gültigen float konvertieren können (zto_f
. B. mit ).quelle
Fixnum
scheint nicht mit Schwimmern zu funktionieren. Funktioniert jedochNumeric
gut. Also1.234.is_a? Fixnum == false
, aber1.234.is_a? Numeric == true
.1.1.is_a? Numeric
Siehe stackoverflow.com/a/17668654/76486pry(main)> '12'.is_a? Numeric => false
'12'
ist ein String. Überprüfen Sie in diesem Fall die Zeichenfolge mit Regex oder einer anderen möglichen Lösung.Normalerweise benutze ich heutzutage nur Integer und 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
quelle
Sie können Folgendes hinzufügen:
validates_numericality_of :the_field
in Ihrem Modell.
Siehe: http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M002172
quelle
Konvertieren Sie den String einfach zweimal:
num = '12' num == num.to_i.to_s #=> true num = '3re' num == num.to_i.to_s #=> false
quelle
"7" == "7".to_f.to_s #=> false
("7" vs "7.0")num == num.to_i.to_s || num == num.to_f.to_s
Ich würde diesen vorschlagen
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
quelle
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
quelle
String-Werte werden mit .to_i immer in 0 konvertiert
[14] pry(main)> 'Apple'.to_i > 0 => false [15] pry(main)> '101'.to_i > 0 => true
quelle