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: lequel d'entre eux est une alternative plus plausible? Ou, existe-t-il une autre meilleure mise en œuvre? P> p>
8 Réponses :
Le premier a l'air sain d'esprit. P>
Je nommerais la méthode numérique? code>, cependant. Je ne suis pas un grand fan de
is_foo? Code> 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 code>,
isfoo code>), mais avec le point d'interrogation, le
est code> se sent redondant. p>
J'ai fini par utiliser le second.
La seconde finira plus rapidement dans le cas d'une chaîne non numérique, car elle rejettera sur le premier mauvais caractère. P>
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 p>
Le problème avec TO_I est que vous ne savez jamais si c'est 0 ou pas un numéro.
Je ne sais pas si cela est rapide, mais j'aime bien:
class String def numeric? true if Integer(object) rescue false end end
Est-ce que cela fonctionne vraiment? D'où vient objet code>? Sur mon rubis 1.9.2-P180, il retourne toujours
false code> car
objet code> est indéfini.
Je pense que objet code> devrait être
auto code> dans ce cas.
Je ne suis pas 100% certain mais des rails semble utiliser / \ a [+ -]? \ d + \ z / code> pour les entiers.
Cliquez sur Show Source pour Validates_numericity_of Code> ici a> p>
\ 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.
Veuillez vous assurer d'utiliser Par exemple, \ a code> et
\ z code> plutôt que
^ code> et
$ code>, pour correspondre à l'ensemble chaîne plutôt qu'une seule ligne dans la chaîne. Si vous souhaitez éviter de faire correspondre une chaîne avec une ligne de fin, utilisez '\ z' à la fin. Pour plus de problèmes, voir Le tutoriel de regex sur les ancrages .
/ ^ [0-9] + $ / code> correspond correctement aux suivants: p>
foo
1234
bar
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 p>
La logique de Zalus a raison. Il suffit de vérifier une fois pour une chaîne non valide. P>
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
AVIS
n = '1234' n.to_i.to_s == n => true n2 = '1.3' n.to_i.to_s == n2 => false
Hors de curiosité, pourquoi le multiplicateur
{1,1} code>? 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/...