1799 votes

Comment puis-je vérifier si une chaîne est un nombre en Python?

Quelle est la meilleure façon de vérifier si une chaîne de caractères peut être représenté comme un nombre en Python?

La fonction actuellement j'ai le droit maintenant:

def is_number(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

Qui, non seulement c'est moche et lent, semble maladroit. Cependant, je n'ai pas trouvé une meilleure méthode, car en appelant float dans la fonction principale est encore pire.

1705voto

Zoomulator Points 7692

Utiliser l'appel isdigit() pour les objets string.

a = "03523"
a.isdigit()

True

b = "963spam"
b.isdigit()

False

Méthodes String - appel isdigit()

Il y a aussi quelque chose sur les chaînes Unicode, ce qui je ne suis pas trop familier avec Unicode Est décimal/décimal

760voto

S.Lott Points 207588

Qui, non seulement c'est moche et lent

J'avais des différends à la fois.

Une regex ou autre traitement de chaîne serait plus laide et plus lent.

Je ne suis pas sûr que quelque chose pourrait être plus rapide que le précédent. Il appelle la fonction et retourne. Try/Catch ne pas introduire beaucoup de surcharge, car l'exception la plus courante est pris sans une recherche approfondie de la pile d'images.

Le problème est que tout numérique de la fonction de conversion a deux types de résultats

  • Un numéro si le numéro est valide
  • Un code de statut (par exemple, via errno) ou une exception à montrer qu'aucun numéro de série valide pourrait être analysée.

C (par exemple) hacks autour de cette un certain nombre de façons. Python pose clairement et explicitement.

Je pense que votre code pour le faire, c'est parfait.

77voto

Guilherme Rocha Points 455

Il y a une exception que vous voudrez peut-être prendre en compte: la chaîne 'NaN'

Si vous voulez is_number de FAUSSE déclaration pour 'NaN' ce code ne fonctionnera pas comme Python convertit à sa représentation d'un nombre qui n'est pas un nombre (on peut parler de problèmes d'identité):

>>> float('NaN')
nan

Sinon, je dois vous remercier pour le morceau de code que j'ai maintenant utilisés intensivement. :)

G.

61voto

haxwithaxe Points 171

comment à ce sujet:

'3.14'.replace('.','',1).isdigit()

qui retournera true seulement si il y en a un ou pas '.' dans la chaîne de chiffres.

'3.14.5'.replace('.','',1).isdigit()

retourne false

edit: viens de voir un autre commentaire ... l'ajout d'un .replace(badstuff,'',maxnum_badstuff) pour les autres cas peut être fait. si vous êtes de passage à sel et à l'arbitraire des condiments (ref:xkcd#974) ce sera parfait :P

41voto

Jason Baker Points 56682

Qui, non seulement c'est moche et lent, semble maladroit.

Il peut prendre un certain temps d'adaptation, mais c'est la pythonic façon de faire. Comme il a été déjà souligné, les alternatives sont pires. Mais il est un autre avantage de faire les choses de cette façon: le polymorphisme.

L'idée centrale derrière le duck-typing est que "si ça marche et parle comme un canard, alors c'est un canard." Que faire si vous décidez que vous avez besoin à la sous-classe de la chaîne de sorte que vous pouvez modifier la façon de déterminer si quelque chose peut être converti en float? Ou si vous décidez de tester un autre objet entièrement? Vous pouvez faire ces choses sans avoir à changer le code ci-dessus.

D'autres langues résoudre ces problèmes par l'utilisation d'interfaces. Je vais économiser de l'analyse de la solution qui est mieux pour un autre thread. Le point, cependant, est que python est décidément sur le duck-typing côté de l'équation, et vous allez probablement avoir à s'habituer à la syntaxe de ce genre si vous prévoyez de faire beaucoup de programmation en Python (mais cela ne veut pas dire que tu dois aimer ça, bien sûr).

Une autre chose que vous pourriez vouloir prendre en considération: Python est assez rapide à lancer et rattraper les exceptions par rapport à beaucoup d'autres langues (30x plus rapide que .Net par exemple). Diable, que le langage lui-même, même lève des exceptions à communiquer de façon non exceptionnelle, programme normal conditions (à chaque fois que vous utilisez une boucle for). Donc, je ne m'inquiéterais pas trop sur les aspects de la performance de ce code jusqu'à ce que vous remarquez un problème important.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X