Comment convertir une chaîne de caractères en Float ou Int en Python

  1. float() pour convertir une chaîne de caractères en float en Python
  2. int() pour convertir la chaîne en int en Python
  3. ast.literal_eval pour convertir la chaîne en float ou int en Python
  4. Localisation et virgules dans la conversion d’une chaîne de caractères en Python
  5. Comparaison des performances de différentes méthodes pour convertir des chaînes de caractères en float ou int en Python

Cet article du tutoriel présente comment convertir une chaîne de caractères en float ou en int en Python.

float() pour convertir une chaîne de caractères en float en Python

float() convertit la chaîne de caractères en nombre de pointage float, si possible.

>>> float('111.2222')
111.2222
>>> float('111.0')
111.0
>>> float('111')
111.0

int() pour convertir la chaîne en int en Python

int() pourrait convertir la chaîne en un entier si la chaîne donnée est la représentation d’un entier. Sinon, il va générer une ErreurValeur.

>>> int('111')
111
>>> int('111.0')
Traceback (most recent call last):
  File "<pyshell#43>", line 1, in <module>
    int('111.0')
ValueError: invalid literal for int() with base 10: '111.0'
>>> int('111.22222')
Traceback (most recent call last):
  File "<pyshell#45>", line 1, in <module>
    int('111.22222')
ValueError: invalid literal for int() with base 10: '111.22222'

Vous pouvez d’abord convertir la chaîne en float et ensuite la lancer en int si la chaîne donnée est la représentation d’un nombre à virgule flottante.

>>> int(float('111.0'))
111

ast.literal_eval pour convertir la chaîne en float ou int en Python

ast.literal_eval(string) évalue en toute sécurité la chaîne donnée contenant une expression Python. Il peut convertir la chaîne en float ou int automatiquement.

>>> ast.literal_eval('111.2222')
111.2222
>>> ast.literal_eval('111.0')
111.0
>>> ast.literal_eval('111')
111

Localisation et virgules dans la conversion d’une chaîne de caractères en Python

Si la virgule , existe dans la représentation de la chaîne de caractères, alors la conversion float lancera une exception ValueError. Mais les virgules sont généralement utilisées soit comme séparateur de milliers dans des pays comme les Etats-Unis ou le Royaume-Uni, par exemple 111,111.22, soit comme séparateur décimal dans la plupart des pays européens, par exemple 111,222.

>>> float('111,111.22')
Traceback (most recent call last):
  File "<pyshell#54>", line 1, in <module>
    float('111,111.22')
ValueError: could not convert string to float: '111,111.22'
>>> float('111,111')
Traceback (most recent call last):
  File "<pyshell#55>", line 1, in <module>
    float('111,111')
ValueError: could not convert string to float: '111,111'

Le module locale devrait être utilisé pour assigner les informations locales et ensuite la fonction locale.atof() pourrait analyser la chaîne donnée comme un flottant selon les paramètres locaux.

Les virgules comme séparateur de milliers aux Etats-Unis ou au Royaume-Uni

>>> import locale
>>> A = '111,111.222'
>>> locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.atof(A)
111111.222
>>> locale.atof('111,111')
111111.0

La virgule , pourrait être interprétée correctement si le bon paramètre de locale est donné.

Soyez également conscient que le résultat de la conversion est toujours de type float même si la représentation de la chaîne donnée est un entier.

Les virgules comme marque démique dans les pays européens

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'nl_NL')
'nl_NL'
>>> locale.atof('111,222')
111.222
>>> locale.atof('111.111,222')
111111.222

111,222 est converti correctement en 111.222, et 111.111,222 pourrait aussi être converti correctement en 111111.222, car le point . est utilisé comme séparateur de milliers dans les pays européens comme les Pays-Bas.

Comparaison des performances de différentes méthodes pour convertir des chaînes de caractères en float ou int en Python

Nous utilisons timeit pour vérifier les performances d’efficacité entre les différentes méthodes.

>>> import timeint
>>> timeit.timeit('float(111.2222)', number=1000000)
0.14707240000007005
>>> timeit.timeit('ast.literal_eval("111.2222")', setup='import ast', number=1000000)
4.779956100000163
>>> timeit.timeit('locale.atof("111.2222")', setup='import locale; locale.setlocale(locale.LC_ALL, "en_US.UTF-8")', number=1000000)
6.092166299999917

La méthode ast.literal_eval() est énormément plus lente que la méthode float comme montré ci-dessus. Elle ne devrait pas être le premier choix si vous avez simplement besoin de convertir une chaîne de caractères en float ou en int en Python. La méthode ast.literal_eval() est sur-enginée dans cette application car sa cible principale devrait être l’évaluation de la chaîne contenant l’expression Python.

locale.atof() est aussi extrêmement lent, donc il ne devrait être utilisé que lorsque des virgules existent dans la chaîne pour la convention en US ou UK, ou le point . signifie le séparateur de milliers mais la virgule , signifie la marque décimale dans les pays européens. En d’autres termes, vous devriez utiliser locale.atof() si c’est vraiment nécessaire.

Article connexe - Python String

  • Comment vérifier qu'une chaîne est vide de manière pythonique
  • Comment supprimer les espaces dans une chaîne de caractères en Python
  • Comment convertir une chaîne de caractères en datetime en Python
  • Comment convertir une chaîne de caractères en minuscules en Python 2 et 3
  • Comment vérifier si une chaîne de caractères contient une sous-chaîne en Python
  • Comment convertir une liste en chaîne de caractères en Python
  • Comment lire un fichier ligne par ligne dans une liste en Python
  • Comment convertir une chaîne de caractères en octets en Python
  • comments powered by Disqus