Ich habe beispielsweise eine Zeichenfolge '123'
und möchte sie in eine Ganzzahl konvertieren 123
.
Ich weiß, dass Sie es einfach tun können some_string.to_i
, aber das wandelt sich 'lolipops'
in um 0
, was nicht der Effekt ist, an den ich denke . Ich möchte, dass es mir ins Gesicht sprengt, wenn ich versuche, etwas Ungültiges mit einem schönen und schmerzhaften umzuwandeln Exception
. Ansonsten kann ich nicht zwischen einem gültigen 0
und etwas unterscheiden, das überhaupt keine Zahl ist.
EDIT: Ich habe nach der Standardmethode gesucht, ohne Regex-Tricks.
^
und$
haben subtil andere Bedeutungen als Metachars als in den meisten anderen Regexp-Geschmacksrichtungen. Sie wollen wahrscheinlich\A
und\Z
stattdessen verwenden.\z
anstelle von\Z
als Beschreibung für den großgeschriebenen Z-Anker: "Entspricht dem Ende der Zeichenfolge. Wenn die Zeichenfolge mit einer neuen Zeile endet, stimmt sie kurz vor der neuen ZeileBeachten Sie auch die Auswirkungen, die die derzeit akzeptierte Lösung auf das Parsen von Hex-, Oktal- und Binärzahlen haben kann:
In Ruby-Zahlen, die mit
0x
oder0X
hexadezimal0b
oder0B
binär beginnen und nur0
oktal sind. Wenn dies nicht das gewünschte Verhalten ist, können Sie dies mit einigen anderen Lösungen kombinieren, die prüfen, ob die Zeichenfolge zuerst mit einem Muster übereinstimmt. Wie die/\d+/
regulären Ausdrücke usw.quelle
Ein weiteres unerwartetes Verhalten mit der akzeptierten Lösung (mit 1.8, 1.9 ist in Ordnung):
Wenn Sie also nicht sicher sind, was übergeben wird, stellen Sie sicher, dass Sie a hinzufügen
.to_s
.quelle
Ich mag Myrons Antwort, aber sie leidet unter der Ruby-Krankheit "Ich verwende kein Java / C # mehr, daher werde ich nie wieder Vererbung verwenden" . Das Öffnen einer Klasse kann mit Gefahren verbunden sein und sollte sparsam eingesetzt werden, insbesondere wenn es Teil von Rubys Kernbibliothek ist. Ich sage nicht, dass Sie es niemals verwenden sollten, aber es ist normalerweise leicht zu vermeiden und es gibt bessere Optionen, z
Wenn Sie dann eine Zeichenfolge verwenden möchten, die eine Zahl sein kann, ist klar, was Sie tun, und Sie blockieren keine Kernklasse, z
Sie können bei der Initialisierung alle möglichen anderen Überprüfungen hinzufügen, z. B. das Überprüfen auf Binärzahlen usw. Die Hauptsache ist jedoch, dass Ruby für Menschen ist und für Menschen zu sein bedeutet Klarheit . Das Benennen eines Objekts über seinen Variablennamen und seinen Klassennamen macht die Dinge viel klarer.
quelle
Ich musste mich in meinem letzten Projekt damit befassen, und meine Implementierung war ähnlich, aber etwas anders:
quelle
Wahrscheinlich nicht der sauberste Weg, sollte aber funktionieren.
quelle
Re: Chris Antwort
Ihre Implementierung lässt Dinge wie "1a" oder "b2" durch. Wie wäre es stattdessen damit:
Dies gibt aus:
quelle
\z
anstelle von\Z
als Beschreibung für den großgeschriebenen Z-Anker: "Entspricht dem Ende der Zeichenfolge. Wenn die Zeichenfolge mit einer neuen Zeile endet, stimmt sie kurz vor der neuen Zeile