12
votes

Convertir des chaînes de python en flotteurs explicitement en utilisant la virgule ou le point comme séparateurs

Comment puis-je dire explicitement Python de lire un nombre décimal en utilisant le point ou la virgule comme séparateur décimal? Je ne connais pas les paramètres de localisation du PC qui exécuteront mon script, et cela ne devrait pas influencer mon application, je veux seulement dire:

def read_float_with_comma(num):
    return float(num.replace(",", ".")


2 commentaires

Qu'est-ce que 1 000 : un ou un mille?


@Katrielaalex: Exactement, cela dépend de la locale.


3 Réponses :


14
votes

10 commentaires

Cela utilisera les paramètres locaux, ce qui n'est peut-être pas ce que veut Diegogb. Et si vous avez besoin de produire / analyser des données dans une locale différente en tant que courant? Le module local décourage explicitement la modification des paramètres régionaux dans une bibliothèque. Cette méthode n'est donc valable que pour des scripts simples.


@ Jeckyll2Hide: Pour des scripts simples ou des programmes d'interface graphique de bureau ou autre chose qui n'a pas besoin de servir plusieurs clients (en réseau).


@ Jeckyll2Hide: Mais l'OP souhaitait spécifiquement savoir ce que le PC sur lequel son script serait exécuté, c'est donc exactement ce qui était recherché. C'est pourquoi la OP a marqué cette réponse comme acceptée; leur problème a été résolu.


Eh bien, pas vraiment: l'OP a voulu forcer un format indépendant de la locale actuelle. Ce qui signifie, soit réinventer la roue en mettant en œuvre sa propre fonction pour analyser la virgule ou le point, ou forcer une locale qui utilise ce qu'il a besoin dans chaque cas. Mais la modification de la locale est découragée et lente, de sorte que toute application mise en œuvre à l'aide de ce changement locale ne devrait le faire qu'une fois (idéalement au début de l'application). Cette application sera très inflexible: elle n'utilisera / sortira que dans un format prédéfini et la modification nécessitera un redémarrage. Je ne vois pas comment cela peut être bon pour une interface graphique.


@ Jeckyll2Hide: Bien sûr, > Locale peut être douloureux . Mais j'ai compris la question: je veux savoir quel séparateur utilise la locale lorsqu'il représente les numéros de points flottants. Quelles autres options sont là pour interroger le système d'exploitation pour ces informations?


Utiliser uniquement _Locale_radix est une étape très dangereuse.


@iliasiliadis: de quelle manière est-ce très dangereux ?


@ Martijn Pieters Utilisation uniquement est le point clé. Conversion d'une chaîne comme "1.000.000.000.000" , Utilisation de Le RADIX, à "1.000.000.000" fera le code inutilisable.


@iliasiliadis: C'est juste un bug simple. Rien dangereux à propos d'un tel bogue.


@ Martijn Pieters Si proposant aux utilisateurs, une façon de créer, dans leur code, des bogues avancées connues ne sont pas un " proposer quelque chose de dangereux " alors ok.



11
votes

Vous pouvez utiliser locale.atof xxx

http://docs.python.org/2/library/locale.html


0 commentaires

3
votes

Vous pouvez utiliser Babel pour analyser les décimales dans Formats locaux:

>>> parse_decimal('1,099.98', locale='en_US')
Decimal('1099.98')
>>> parse_decimal('1.099,98', locale='de')
Decimal('1099.98')


1 commentaires

Comme babel.pocoo.org/fr/latest/numbers.html#parsing -numbers états dans une note: l'analyse de numéro n'est pas correctement mise en œuvre