99 votes

Comment puis-je utiliser Python pour convertir une chaîne en nombre si il a des virgules comme séparateurs de milliers?

J'ai une chaîne qui représente un nombre qui utilise des virgules pour séparer les milliers. Comment puis-je convertir ce pour un certain nombre de python?

>>> int("1,000,000")

Génère un ValueError.

Je pourrais remplacer les virgules par des chaînes vides avant que j'essaie de le convertir, mais qui se sent mal en quelque sorte. Est-il un meilleur moyen?

119voto

unutbu Points 222216
import locale
locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' ) 
locale.atoi('1,000,000')
# 1000000
locale.atof('1,000,000.53')
# 1000000.53

46voto

Denis Otkidach Points 13111

Il y a plusieurs façons d'analyser des nombres avec des séparateurs de milliers. Et je doute que de la manière décrite par ~ubuntu est la meilleure dans tous les cas. C'est pourquoi j'ai la liste des autres moyens.

  1. Le bon endroit pour appeler à la setlocale() est __main__ module. C'est paramètre global qui affecte l'ensemble du programme, et même C extensions (à noter toutefois que la LC_NUMERIC paramètre n'est pas défini au niveau du système, mais est émulé par Python). Lire les mises en garde de la documentation et de réfléchir à deux fois avant d'aller de cette façon. C'est probablement OK en application unique, mais ne l'utilisez jamais dans les bibliothèques pour le large public. Probablement vous devriez éviter de demander locale avec certains encodage de caractères, car elle pourrait ne pas être disponible sur certains systèmes.

  2. Utilisez l'une des bibliothèques tierces pour l'internationalisation. Par exemple PyICU permet d'utiliser tout les paramètres régionaux sans affectent l'ensemble du processus (et même l'analyse des nombres avec, en particulier, les séparateurs de milliers, sans l'aide de paramètres régionaux):

    NumberFormat.createInstance(paramètres Régionaux('fr_fr')).parse("1 000 000 d'").getLong()

  3. Écrire votre propre fonction d'analyse syntaxique, si vous n'avez pas d'installer des bibliothèques tierces pour faire "bien". Il peut être aussi simple que d' int(data.replace(',', '')) lors de la validation stricte n'est pas nécessaire.

18voto

Cody Piersall Points 1346

Remplacer les virgules par des chaînes vides, et tournez la chaîne obtenue en int ou float.

>>> a = '1,000,000'
>>> int(a.replace(',',''))
1000000
>>> float(a.replace(',',''))
1000000.0

3voto

Tony Veijalainen Points 2579

J'ai eu des paramètres régionaux de l'erreur de accepté d'erreur, voici donc ce qui fonctionne ici en Finlande dans Windows XP:

   import locale
   locale.setlocale( locale.LC_ALL, 'english_USA' )
   print locale.atoi('1,000,000')
   # 1000000
   print locale.atof('1,000,000.53')
   # 1000000.53

3voto

Wizmann Points 142

Ceci fonctionne:

>>> a='-1,234,567,89.0123'
>>> "".join(a.split(","))
'-123456789.0123'

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