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?
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?
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)
v.to_s =~ /\A[-+]?\d*\.?\d+\z/.
Sie können verwenden
12.is_a? Numeric
( Numericfunktioniert 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 (z to_f. B. mit ).
Fixnumscheint nicht mit Schwimmern zu funktionieren. Funktioniert jedoch Numericgut. Also 1.234.is_a? Fixnum == false, aber 1.234.is_a? Numeric == true.
1.1.is_a? NumericSiehe stackoverflow.com/a/17668654/76486
pry(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
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
Konvertieren Sie den String einfach zweimal:
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" 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
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