Verfügt Rails 3 oder Ruby über eine integrierte Methode, um zu überprüfen, ob eine Variable eine Ganzzahl ist?
Beispielsweise,
1.is_an_int #=> true
"[email protected]".is_an_int #=> false?
ruby
ruby-on-rails-3
Ein Lehrling
quelle
quelle
to_i
. Das ist Teil von Rubys "Ententypisierung": Wenn es sich wie eine ganze Zahl verhalten kann, behandeln Sie es wie eine.kind_of?
ist ein Alias zuis_a?
.is_a?
ist etwas anders; es fragt, ob das Objekt einer Instanz einer bestimmten Klasse;kind_of?
fragt, ob es sich um eine Instanz oder ein Kind einer bestimmten Klasse handelt.fido.is_a? Dog
ist wahr;fido.kind_of? Animal
ist zum Beispiel wahr.Antworten:
Sie können die
is_a?
Methode verwendenquelle
Integer(obj) rescue false
Dies funktioniert nicht für "1", wenn Sie überprüfen möchten, ob es konvertiertWenn Sie wissen möchten, ob es sich bei einem Objekt um ein Objekt handelt
Integer
oder um ein Objekt , das sinnvoll in eine Ganzzahl konvertiert werden kann (ohne Dinge wie die"hello"
, in dieto_i
konvertiert werden soll0
):quelle
Integer(2.5) => 2
es sich immer um eine sinnvolle Konvertierung handelt.Verwenden Sie einen regulären Ausdruck für eine Zeichenfolge:
Wenn Sie überprüfen möchten, ob eine Variable von einem bestimmten Typ ist, können Sie einfach Folgendes verwenden
kind_of?
:quelle
\d+?
der?
spezifiziert eine nicht gierige Übereinstimmung, während Sie wahrscheinlich eine optionale Übereinstimmung wollen. Das Ändern\d+?
in\d*
könnte das Problem beheben, aber ich möchte es sicherheitshalber durch eine Reihe von Tests führen. Dies stimmt auch nicht mit der Hex- oder Exponentialschreibweise überein, aber ich bin sicher, dass dies für bestimmte Anwendungsfälle in Ordnung ist.\A\d+\z
?Integer(obj) rescue false
Code von @ alex-d unten; Regexp ist schwer zu lesen und in seiner Absicht nicht klar. Bei beiden Arbeiten kam ich zu dieser Frage, um einen schlecht konstruierten regulären Ausdruck zu beheben, der nicht immer funktionierte :-)Wenn Sie sich über den Typ der Variablen nicht sicher sind (es kann sich um eine Zeichenfolge mit Zahlen handeln), sagen Sie, dass es sich um eine Kreditkartennummer handelt, die an die Parameter übergeben wurde. Es handelt sich also ursprünglich um eine Zeichenfolge, aber Sie möchten sicherstellen, dass dies nicht der Fall ist. ' Wenn keine Buchstaben enthalten sind, würde ich diese Methode verwenden:
@Benny weist auf ein Versehen dieser Methode hin, denken Sie daran:
quelle
obj.to_s == obj.to_f.to_s
genau wie in meinem Fall.Sie können Triple Equal verwenden.
quelle
Es gibt
var.is_a? Class
(in Ihrem Fall :)var.is_a? Integer
; das könnte die Rechnung passen. Oder es gibt eine StelleInteger(var)
, an der eine Ausnahme ausgelöst wird, wenn sie nicht analysiert werden kann.quelle
Eine "Enten-Typisierung" -Methode besteht darin, auf
respond_to?
diese Weise auch "ganzzahlige" oder "stringartige" Klassen zu verwendenquelle
Für den Fall , müssen Sie keine Null - Werte konvertieren, ich die Methoden finden
to_i
undto_f
äußerst nützlich sein , da sie die Zeichenfolge entweder auf einen Null - Wert konvertieren (wenn nicht konvertierbar oder Null) oder der tatsächlichenInteger
oderFloat
Wert.EDIT2: Sei vorsichtig, der
0
ganzzahlige Wert ist nicht falsch, er ist wahr (!!0 #=> true
) (danke @prettycoder)BEARBEITEN
Ich habe gerade von den dunklen Fällen erfahren ... scheint nur zu passieren, wenn die Nummer an erster Stelle steht
quelle
Um die Antwort von Alex D mit Verfeinerungen zu nutzen :
Später in deiner Klasse:
quelle
Ich hatte ein ähnliches Problem, bevor ich versuchte festzustellen, ob es sich bei etwas um eine Zeichenfolge oder eine beliebige Zahl handelt. Ich habe versucht, einen regulären Ausdruck zu verwenden, aber das ist für meinen Anwendungsfall nicht zuverlässig. Stattdessen können Sie die Klasse der Variablen überprüfen, um festzustellen, ob sie ein Nachkomme der numerischen Klasse ist.
In dieser Situation können Sie auch einen der numerischen Nachkommen ersetzen: BigDecimal, Date :: Infinity, Integer, Fixnum, Float, Bignum, Rational, Complex
quelle
Wahrscheinlich suchen Sie so etwas:
Akzeptieren Sie "2.0 oder 2.0 als INT, lehnen Sie jedoch 2.1 und" 2.1 "ab.
quelle