J'ai une chaîne, disons '123'
, et je veux la convertir en entier 123
.
Je sais que vous pouvez le faire simplement some_string.to_i
, mais cela se transforme 'lolipops'
en 0
, ce qui n'est pas l'effet que j'ai à l'esprit. Je veux que ça me saute au visage quand j'essaye de convertir quelque chose d'invalide, avec un joli et douloureux Exception
. Sinon, je ne peux pas faire la distinction entre un valide 0
et quelque chose qui n'est tout simplement pas un nombre.
EDIT: Je cherchais la manière standard de le faire, sans ruse regex.
^
et$
ont des significations subtilement différentes en tant que métachars que dans la plupart des autres saveurs de regexp. Vous voulez probablement utiliser\A
et à la\Z
place.\z
à la place de\Z
car la description de l'ancre Z majuscule est: "Correspond à la fin de la chaîne. Si la chaîne se termine par une nouvelle ligne, elle correspond juste avant la nouvelle ligne" - ruby-doc.org/core-2.1.1/Regexp .htmlSoyez également conscient des effets que la solution actuellement acceptée peut avoir sur l'analyse des nombres hexadécimaux, octaux et binaires:
Dans Ruby, les nombres commençant par
0x
ou0X
sont hexadécimaux,0b
ou0B
binaires, et0
sont simplement octaux. Si ce n'est pas le comportement souhaité, vous pouvez combiner cela avec certaines des autres solutions qui vérifient si la chaîne correspond d'abord à un modèle. Comme les/\d+/
expressions régulières, etc.la source
Un autre comportement inattendu avec la solution acceptée (avec 1.8, 1.9 est ok):
donc si vous n'êtes pas sûr de ce qui est transmis, assurez-vous d'ajouter un fichier
.to_s
.la source
J'aime la réponse de Myron mais il souffre de la maladie de Ruby "Je n'utilise plus Java / C # donc je n'utiliserai plus jamais l'héritage" . L'ouverture de n'importe quelle classe peut être dangereuse et doit être utilisée avec parcimonie, en particulier lorsqu'elle fait partie de la bibliothèque principale de Ruby. Je ne dis pas de ne jamais l'utiliser, mais c'est généralement facile à éviter et qu'il existe de meilleures options disponibles, par exemple
Ensuite, lorsque vous souhaitez utiliser une chaîne qui pourrait être un nombre, ce que vous faites est clair et vous ne frappez aucune classe de base, par exemple
Vous pouvez ajouter toutes sortes d'autres vérifications dans l'initialisation, comme la vérification des nombres binaires, etc. L'essentiel cependant, c'est que Ruby est pour les gens et être pour les gens signifie la clarté . Nommer un objet via son nom de variable et son nom de classe rend les choses beaucoup plus claires.
la source
J'ai dû gérer cela dans mon dernier projet, et ma mise en œuvre était similaire, mais un peu différente:
la source
Ce n'est probablement pas la façon la plus propre de le faire, mais cela devrait fonctionner.
la source
Re: la réponse de Chris
Votre implémentation laisse passer des choses comme "1a" ou "b2". Que diriez-vous plutôt de ceci:
Cela produit:
la source
\z
à la place de\Z
car la description de l'ancre Z majuscule est: "Correspond à la fin de la chaîne. Si la chaîne se termine par une nouvelle ligne, elle correspond juste avant la nouvelle ligne" - ruby-doc.org/core-2.1.1/Regexp .html