10
votes

Mise en œuvre Ruby IS_Numeric? Pour les chaînes, nécessitent de meilleures alternatives

Je voulais valider la "numéricalité" d'une chaîne (ce n'est pas un attribut dans un modèle d'enregistrement actif). J'en ai juste besoin pour être une base entière positive 10, une base positive. Je fais cela: xxx

lequel d'entre eux est une alternative plus plausible? Ou, existe-t-il une autre meilleure mise en œuvre?


3 commentaires

Hors de curiosité, pourquoi le multiplicateur {1,1} ? Par défaut, toutes les classes de caractères et les littéraux sont assortis exactement une fois, sauf indication contraire. Ceci est redondant.


Pauvre de moi! Je vais le supprimer à la fois.


Question connexe: Stackoverflow.com/Questtions/694176/...


8 Réponses :


5
votes

Le premier a l'air sain d'esprit.

Je nommerais la méthode numérique? , cependant. Je ne suis pas un grand fan de is_foo? méthodes. Ils ont un sens dans des langues qui n'ont pas de points d'interrogation dans les noms de méthodes ( is_foo , isfoo ), mais avec le point d'interrogation, le est se sent redondant.


1 commentaires

J'ai fini par utiliser le second.



1
votes

La seconde finira plus rapidement dans le cas d'une chaîne non numérique, car elle rejettera sur le premier mauvais caractère.

Aussi, consultez la méthode de la chaîne # to_i - il fait éventuellement ce que vous voulez:
http://www.ruby-doc.org/core/classes/ String.html # m000787


1 commentaires

Le problème avec TO_I est que vous ne savez jamais si c'est 0 ou pas un numéro.



1
votes

Je ne sais pas si cela est rapide, mais j'aime bien:

class String
 def numeric?
    true if Integer(object) rescue false
 end
end


2 commentaires

Est-ce que cela fonctionne vraiment? D'où vient objet ? Sur mon rubis 1.9.2-P180, il retourne toujours false car objet est indéfini.


Je pense que objet devrait être auto dans ce cas.



3
votes

Je ne suis pas 100% certain mais des rails semble utiliser / \ a [+ -]? \ d + \ z / pour les entiers.
Cliquez sur Show Source pour Validates_numericity_of ici


1 commentaires

\ A -> Début de chaîne \ z -> Fin de la chaîne Fondamentalement la même chose que j'utilise dans la première, à l'exception de la partie de modificateur positif / négatif.




0
votes

Selon une référence simple, la deuxième approche est plus rapide, bien que je ne sois pas un benchmarker expert, cela pourrait donc ne pas être une référence valide: http://pastie.org/586777

La logique de Zalus a raison. Il suffit de vérifier une fois pour une chaîne non valide.


0 commentaires

2
votes

Je suggérerais une autre façon de le faire. En outre, parce que vous avez demandé au "positif" entier, j'ai fait deux méthodes distinctes pour un entier entier et non négatif positif.

class String
  def integer?
    self.to_i.to_s == self
  end
end


0 commentaires

0
votes

AVIS

n = '1234'
n.to_i.to_s == n
=> true

n2 = '1.3'
n.to_i.to_s == n2
=> false


0 commentaires