2013-09-28 4 views
-2

J'essaie d'obtenir un entier à partir de la chaîne '(3)'. Cependant, la méthode to_i renvoie 0. Il semble que les parenthèses avec des citations causent le problème, mais je ne comprends pas la raison.Ruby - Analyser '(3)' en entier renvoie 0

'3'.to_i => 3 
(3).to_i => 3 
'(3)'.to_i => 0 

Pourquoi cela se produit-il et comment le résoudre? Je vous remercie!

Répondre

2

String#to_i ne tient pas compte en fin de chaîne (non numériques):

"3foo".to_i   #=> 3 
"3)".to_i         #=> 3 

personnages principaux (non numériques) ne fonctionnent pas et retour 0:

"foo3".to_i   #=> 0 
"(3".to_i         #=> 0 

Vous pouvez extraire la partie entière en utilisant régulièrement expression:

"(3)"[/-?\d+/]  #=> "3" 

et convertir qui à un entier:

"(3)"[/-?\d+/].to_i #=> 3 
1

(3) est une expression, pas une chaîne; il évalue à nombre3.

'3' est un littéral de chaîne, il n'évalue aucun nombre, mais peut être converti en to_i. Les règles sont quite simple:

retour le résultat de l'interprétation des caractères principaux dans str comme une base de base entier (entre 2 et 36). Les caractères externes dépassant la fin d'un nombre valide sont ignorés. S'il n'y a pas de nombre valide à , le début de str, 0 est renvoyé. Cette méthode ne déclenche jamais d'exception lorsque la base est valide.

'(3)' est un autre littéral de chaîne, encore une fois il n'évalue à aucun nombre par lui-même. Le problème est que vous ne serez pas en mesure de faire comprendre à l'analyseur que ( au début de cette chaîne particulière doit être traitée comme un séparateur - et essentiellement ignoré. Ce n'est pas comme ça que ça fonctionne.

Une solution possible est de remplacer le symbole ( au début de la chaîne avec sub (comme suivi des symboles non-chiffres sont ignorés par to_i):

'(3)'.sub(/^\(/, '').to_i => 3 

Mais je me demande vraiment pourquoi obtenez-vous la parenthèse en premier lieu ici.

+0

Nous vous remercions de explication exhaustive. (J'avoue que je pourrais regarder à la documentation, je pensais que to_i gère les chaînes comme ça). L'utilisation de parenthèses est juste un problème esthétique, pas grave. – optimista

0

(3) est une expression Ruby et '(3)'.to_i ne fonctionne pas pour la même raison que 'Math.sqrt(9)'.to_i ne fonctionne pas.

Si elle aide, vous pouvez utiliser une expression rationnelle pour choisir la partie de la chaîne qui est un certain nombre, et le convertir

puts '(3)'[/\d+/].to_i 

sortie

3