Ich brauche eine Funktion is_an_integer
, wo
"12".is_an_integer?
gibt true zurück."blah".is_an_integer?
gibt false zurück.
Wie kann ich das in Ruby machen? Ich würde einen regulären Ausdruck schreiben, aber ich gehe davon aus, dass es dafür einen Helfer gibt, den ich nicht kenne.
Antworten:
Sie können reguläre Ausdrücke verwenden. Hier ist die Funktion mit den Vorschlägen von @ janm.
Eine bearbeitete Version laut Kommentar von @wich:
Falls Sie nur positive Zahlen überprüfen müssen
quelle
/regexp/ === self
anstelle des!!(self =~ /regexp/)
Konstrukts verwenden. Sie können Zeichenklasse verwenden ‚\ d‘ statt[0-9]
Hier ist der einfache Weg:
Ich bin nicht mit den Lösungen einverstanden, die eine Ausnahme zum Konvertieren des Strings hervorrufen - Ausnahmen sind kein Kontrollfluss, und Sie können es genauso gut richtig machen. Meine obige Lösung befasst sich jedoch nicht mit Ganzzahlen, die nicht zur Basis 10 gehören. Hier ist also der Weg, ohne auf Ausnahmen zurückzugreifen:
quelle
self.to_i.to_s == self
mitInteger self rescue false
?Sie können verwenden
Integer(str)
und sehen, ob es erhöht:Es sollte darauf hingewiesen werden, dass dies zwar wahr für ist
"01"
, aber nicht für"09"
, einfach weil09
dies kein gültiges ganzzahliges Literal wäre. Wenn dies nicht das gewünschte Verhalten ist, können Sie es10
als zweites Argument hinzufügenInteger
, sodass die Zahl immer als Basis 10 interpretiert wird.quelle
#to_i
sind wegen ihrer Zulässigkeit einfach zu kaputt.Integer()
ist kanonisch, weilInteger ()
Sie sicher wissen, dass alles, was Ruby als ganzzahliges Literal betrachtet, akzeptiert und alles andere abgelehnt wird. Das Duplizieren dessen, was die Sprache Ihnen bereits gibt, ist wohl ein schlechterer Codegeruch als das Verwenden von Ausnahmen zur Kontrolle.Sie können einen Einzeiler machen:
oder auch
Je nachdem, was Sie versuchen, können Sie auch direkt einen Start-End-Block mit einer Rettungsklausel verwenden:
quelle
quelle
true
undfalse
sondernMatchData
Instanzen undnil
!!
oder verwendenpresent?
Sie es , wenn Sie einen Booleschen Wert benötigen!!( "12".match /^(\d)+$/ )
oder"12".match(/^(\d)+$/).present?
(letzterer erfordert Rails / Activesupport)Ruby 2.6.0 ermöglicht das Umwandeln in eine Ganzzahl, ohne eine Ausnahme auszulösen , und kehrt zurück,
nil
wenn das Umwandeln fehlschlägt. Und da es sichnil
meistens wiefalse
in Ruby verhält , können Sie leicht nach einer ganzen Zahl suchen:quelle
is_
. Ich finde das albern bei Fragezeichenmethoden, ich mag es"04".integer?
viel besser als"foo".is_integer?
."01"
und so gilt.quelle
integer?("a string")
ftl.String#integer?
ist die Art von allgemeinem Patch, den jeder Ruby-Codierer und sein Cousin gerne zur Sprache hinzufügen, was zu Codebasen mit drei verschiedenen subtil inkompatiblen Implementierungen und unerwartetem Bruch führt. Ich habe das auf die harte Tour bei großen Ruby-Projekten gelernt.Der beste und einfachste Weg ist die Verwendung
Float
Integer
ist auch gut, aber es wird0
für zurückkehrenInteger nil
quelle
Ich bevorzuge:
config / initializers / string.rb
und dann:
oder überprüfen Sie die Telefonnummer:
quelle
Ein viel einfacherer Weg könnte sein
quelle
quelle
Persönlich mag ich den Ausnahmeansatz, obwohl ich ihn etwas knapper machen würde:
Wie andere bereits gesagt haben, funktioniert dies jedoch nicht mit Octal-Strings.
quelle
Ruby 2.4 hat
Regexp#match?
: (mit a?
)Für ältere Ruby-Versionen gibt es
Regexp#===
. Und obwohl die direkte Verwendung des Fallgleichheitsoperators generell vermieden werden sollte, sieht er hier sehr sauber aus:quelle
Dies ist möglicherweise nicht für alle Fälle geeignet, wenn Sie einfach Folgendes verwenden:
könnte auch für einige tun.
Wenn es eine Zahl und nicht 0 ist, wird eine Zahl zurückgegeben. Wenn es 0 zurückgibt, ist es entweder eine Zeichenfolge oder 0.
quelle
"12blah".to_i => 12
. Dies kann in seltsamen Szenarien zu Problemen führen.Hier ist meine Lösung:
Und so funktioniert es:
/^(\d)+$/
ist ein Regex- Ausdruck zum Suchen von Ziffern in einer beliebigen Zeichenfolge. Sie können Ihre regulären Ausdrücke und Ergebnisse unter http://rubular.com/ testen .IntegerRegex
, um unnötige Speicherzuweisungen bei jeder Verwendung in der Methode zu vermeiden.integer?
ist eine Abfragemethode, dietrue
oder zurückgeben solltefalse
.match
ist eine Methode für eine Zeichenfolge, die mit den Vorkommen gemäß dem angegebenen regulären Ausdruck im Argument übereinstimmt und die übereinstimmenden Werte oder zurückgibtnil
.!!
konvertiert das Ergebnis dermatch
Methode in einen äquivalenten Booleschen Wert.String
Klasse ist das Patchen von Affen, wodurch nichts an den vorhandenen String-Funktionen geändert wird, sondern lediglich eine weitere Methode hinzugefügt wird, dieinteger?
für ein beliebiges String-Objekt benannt ist.quelle
Wenn man die Antwort von @ rado oben erweitert, könnte man auch eine ternäre Anweisung verwenden, um die Rückgabe von wahren oder falschen Booleschen Werten ohne die Verwendung von Doppelknallen zu erzwingen. Zugegeben, die Version mit doppelter logischer Negation ist knapper, aber für Neulinge (wie mich) wahrscheinlich schwerer zu lesen.
quelle
Für allgemeinere Fälle (einschließlich Zahlen mit Dezimalpunkt) können Sie die folgende Methode ausprobieren:
Sie können diese Methode in einer irb-Sitzung testen:
Eine ausführliche Erklärung der Regex finden Sie in diesem Blog-Artikel :)
quelle
obj.is_a? String
da sich String # to_s selbst zurückgibt , was im Vergleich zum.is_a?
Aufruf vermutlich nicht zu viel Verarbeitung erfordert . Auf diese Weise tätigen Sie in dieser Leitung nur einen Anruf anstelle von einem oder zwei. Sie können auch direkt!!
in dienumber?
Methode aufnehmen, da ein Methodenname, der mit endet, gemäß Konvention?
einen booleschen Wert zurückgeben soll. Grüße!Ich mag folgendes direkt:
Vorsicht:
quelle
Ein Liner in
string.rb
quelle
Ich bin mir nicht sicher, ob dies der Fall war, als diese Frage gestellt wurde, aber für jeden, der über diesen Beitrag stolpert, ist der einfachste Weg:
.is_a?
funktioniert mit jedem Objekt.quelle
"12".is_an_integer? == true
"not12".is_an_integer? == false
12.is_an_integer? == true