La conversion numérique de la chaîne numérique en Ruby

Je veux une méthode comme to_numeric(str) qui convertissent la chaîne numérique 'str' dans sa forme numérique else return nil. Par forme numérique si la chaîne est en entier méthode doit retourner integer et string est en float, il doit retourner à flotteur.

J'ai essayé avec le code suivant. Il fonctionne très bien mais ont besoin d'une meilleure solution si possible.

def to_numeric(str)
  Integer(str)
rescue
  Float(str) if Float(str) rescue nil
end

Une chose importante que j'ai oublié de mentionner, c'est "je ne sais pas le type de mon entrée".

Mon cas d'utilisation:

arr = [1, 1.5, 2, 2.5, 4]
some_input = get_input_from_some_source

if arr.include?(to_numeric(some_input))
  # do something
end
  • essayez to_i méthode de la classe string ruby-doc.org/core-1.9.3/String.html#method-i-to_i
  • Par "numérique", je veux dire entiers et à virgule flottante. Je veux convertir "1" ou "1.34" pour sa forme numérique.
  • to_i donne integer ou float, en particulier, un nombre entier.
  • "1.23".to_i donne 1, pas 1.23
  • Oui, c'est vrai. Exactement.
  • veuillez expliquer pourquoi il est important d'obtenir le "bon" type? Si l'on pouvait flotter, pourquoi ne pas toujours se convertir à flotter?
  • Je ne comprends pas le "donne integer ou float" partie, pourriez-vous l'expliquer?
  • to_i renvoie un entier, elle retourne un entier ou un flottant. @nathanvda Non, j'ai répondu à la deuxième commentaire.
  • Euh @sawa, elle renvoie un entier, elle retourne un entier 😉
  • qui est correct. Mais pas sûr si c'est le cas des OP cas. Peut-être qu'il n'est tout simplement pas compétent en ruby, il veut juste pour convertir des chaînes à leur représentation numérique pour les stocker dans la base de données.
  • Il n'a rien à voir avec le Rubis. Simplement, l'OP n'a pas formulé la question. Ce problème vient de là. L'OP écrit que "numérique", et n'a pas une seule mention de ce que la classe d'attendre dans quelles circonstances. L'OP s'attend le lecteur à deviner tout cela et est en train d'être paresseux.
  • veuillez vérifier mes mises à jour de question pour mon cas d'utilisation.
  • suffit d'utiliser des flotteurs [4].include? 4.0 #=> true
  • à partir de votre cas d'utilisation, il semble que myInput.to_f ferait l'affaire, mais si c'est votre précis de cas d'utilisation, alors vous pouvez avoir besoin de le changer. Les comparaisons entre les floats/doubles/.. n'est pas toujours ce que vous attendez. Le nombre 1.5 pourrait ne pas être possible de stocker exactement-comme-il-est dans un "type numérique". Il peut être 1.5000000001. Si après l'analyse de l'entrée, vous obtenez 1.49999999, vous ne le trouveriez pas dans le tableau en simple include?.
  • D'accord avec ça. Mais je sais que la comparaison de la source de 'arr'(ici) qu'il va contenir soit entier ou à virgule flottante en arrondissant à 2. Alors, peut dans ce cas je peux arrondir entrée à 2 et pourrait utiliser la méthode to_numeric. Ce que vous suggérez?

InformationsquelleAutor ram | 2013-11-21