Vérifier si une chaîne de caractères peut être convertie en float en Python
J'ai un peu de code Python qui s'exécute par le biais d'une liste de chaînes de caractères et les convertit en nombres entiers ou des nombres à virgule flottante, si possible. Faire cela pour les entiers est assez facile
if element.isdigit():
newelement = int(element)
Des nombres à virgule flottante sont les plus difficiles. Actuellement, j'utilise partition('.')
de diviser la chaîne et de la vérification pour s'assurer que l'un ou les deux côtés sont des chiffres.
partition = element.partition('.')
if (partition[0].isdigit() and partition[1] == '.' and partition[2].isdigit())
or (partition[0] == '' and partition[1] == '.' and partition[2].isdigit())
or (partition[0].isdigit() and partition[1] == '.' and partition[2] == ''):
newelement = float(element)
Cela fonctionne, mais, évidemment, si l'instruction est un peu un ours. L'autre solution que j'ai envisagé de juste envelopper la conversion dans un bloc try/catch et de voir si elle réussit, comme décrit dans cette question.
Quelqu'un a d'autres idées? Avis sur les mérites relatifs de la partition et try/catch approches?
Vous devez vous connecter pour publier un commentaire.
Je voudrais juste utiliser..
..c'est simple, et ça fonctionne
Une autre option serait une expression régulière:
Python méthode pour vérifier float:
N'obtenez pas un peu par les gobelins se cachant dans le flotteur bateau! FAIRE LES TESTS UNITAIRES!
Ce qui est, et n'est pas un float peut-être vous surprendre:
isfloat(" 1.23 ")
etisfloat(" \n \t 1.23 \n\t\n")
. Utile dans les requêtes web; pas besoin de couper les espaces blancs de la première.qui sera de retour
true
seulement si il y en a un ou pas '.' dans la chaîne de chiffres.sera de retour
false
sera de retour
false
Si vous vous souciez de la performance (et je ne dis pas que vous devriez le savoir), l'essai de l'approche fondée sur le gagnant clair (par rapport avec votre partition de base de l'approche ou de la regexp approche), aussi longtemps que vous ne vous attendez pas beaucoup de chaînes non valides, dans ce cas, c'est potentiellement plus (sans doute à cause du coût de la gestion des exceptions).
Encore une fois, je ne dis pas que vous vous souciez de la performance, tout en vous donnant les données dans le cas où vous êtes en train de faire ce 10 milliards de fois par seconde, ou quelque chose. Aussi, la partition à base de code ne gère pas au moins une chaîne valide.
Voici le code (Python 2.6, regexp prises de Jean Gietzen de réponse):
TL;DR:
try: except:
méthode est la meilleure natif méthode Python.Il existe une autre méthode disponible via un module tiers appelé fastnumbers (communication, je suis l'auteur); il fournit une fonction appelée isfloat. J'ai pris la unittest exemple décrit par Jacob Gabrielson dans cette réponse, mais a ajouté la
fastnumbers.isfloat
méthode. Je tiens également à noter que Jacob n'a pas justice à la regex option parce que la plupart du temps dans l'exemple qui a été dépensé en global des recherches en raison de l'opérateur point... j'ai modifié la fonction de donner une plus juste comparaison àtry: except:
.Sur ma machine, la sortie est:
Comme vous pouvez le voir, la regex n'est en réalité pas aussi mauvais qu'il semblait à l'origine, et si vous avez un réel besoin pour la vitesse, la
fastnumbers
méthode est assez bonne.Juste de variété, voici une autre méthode pour le faire.
Edit: je suis sûr que cela ne permettra pas à tous les cas de flotter mais surtout quand il y a un exposant. Pour résoudre ce que ça ressemble à ça. Cela renvoie Vrai que val est un flotteur et False pour les int, mais sans doute moins performantes que les regex.
Cette regex vérifie scientifique des nombres à virgule flottante:
Cependant, je crois que votre meilleur pari est d'utiliser l'analyseur dans un essai.
Si vous n'avez pas besoin de s'inquiéter à propos de scientifiques ou d'autres expressions de chiffres et travaille uniquement avec des chaînes qui pourraient être des nombres, avec ou sans période:
Fonction
Lambda version
Exemple
De cette façon, vous n'avez pas accidentellement la conversion de ce que doit être un int, un float.
Version simplifiée de la fonction
is_digit(str)
, ce qui suffit dans la plupart des cas (ne pas envisager de notation exponentielle et "NaN" valeur):J'ai utilisé la fonction déjà mentionné, mais j'ai vite remarquer que les chaînes de caractères comme "Nan", "Inf" et variations sont considérées comme nombre. Donc je vous propose version améliorée de la fonction, qui sera de retour faux sur ces type d'entrée et ne manquera pas "1e3" variantes:
if text.isalpha():
vérifier tout de suite?Essayer de convertir un float. Si il y a une erreur, d'imprimer l'exception ValueError.
De sortie:
J'ai été à la recherche pour certains de code similaire, mais il ressemble à l'aide de try/si l'on excepte est le meilleur moyen.
Voici le code que j'utilise. Il comprend une nouvelle tentative de la fonction si l'entrée n'est pas valide. J'avais besoin de vérifier si la valeur d'entrée est supérieure à 0 et si oui, de le convertir à un flotteur.
semble être simple.
Gère les valeurs stockées dans un string ou int ou float