2009-07-07 20 views
41

J'ai une chaîne au format: 'nn.nnnnn' en Python, et je voudrais la convertir en nombre entier.Convertir une chaîne en entier avec décimal en Python

conversion directe échoue:

>>> s = '23.45678' 
>>> i = int(s) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: '23.45678' 

je peux le convertir en un nombre décimal en utilisant: « »

>>> from decimal import * 
>>> d = Decimal(s) 
>>> print d 
23.45678 

Je pourrais aussi partager sur, puis soustrayez la décimale de zéro, puis ajouter ça au nombre entier ... beurk.

Mais je préférerais l'avoir comme un int, sans conversions de type inutiles ou manoeuvrer.

+10

Matt, 23.45678 n'est pas un nombre entier. Si vous voulez que Python convertisse une chaîne en entier, assurez-vous de lui donner un entier. Des arguments peuvent être faits de toute façon sur ce qu'est la "bonne" chose, et à la fin, quelqu'un va être malheureux. – Christopher

Répondre

88

Que pensez-vous de cela?

>>> s = '23.45678' 
>>> int(float(s)) 
23 

Ou ...

>>> int(Decimal(s)) 
23 

Ou ...

>>> int(s.split('.')[0]) 
23 

Je doute que ça va devenir beaucoup plus simple que cela, j'ai peur. Accepte-le et passe à autre chose.

+3

N'oubliez pas d'importer 'decimal', puis utilisez-le comme' decimal.Decimal (5) 'ou faites' de Decimal Import Decimal' et utilisez-le comme 'Decimal (5)'. J'oublie toujours. – teewuane

+0

Vous devez noter le type d'arrondi que chaque option offre à la valeur. – Rapnar

1

Vous pouvez utiliser:

s = '23.245678' 
i = int(float(s)) 
13

Quel genre de comportement d'arrondi ne voulez-vous? Avez-vous 2,67 à transformer en 3 ou 2. Si vous voulez utiliser l'arrondi, essayez ceci:

s = '234.67' 
i = int(round(float(s))) 

Sinon, il suffit de faire:

s = '234.67' 
i = int(float(s)) 
2

« Convert » n'a de sens que lorsque vous changez de un type de données à un autre sans perte de fidélité. Le nombre représenté par la chaîne est un flottant et perdra la précision après avoir été forcé dans un int.

Vous voulez arrondir à la place, probablement (j'espère que les nombres ne représentent pas la devise parce que l'arrondi devient beaucoup plus compliqué).

round(float('23.45678')) 
3
>>> s = '23.45678' 
>>> int(float(s)) 
23 
>>> int(round(float(s))) 
23 
>>> s = '23.54678' 
>>> int(float(s)) 
23 
>>> int(round(float(s))) 
24 

Vous ne spécifiez pas si vous voulez arrondir ou non ...

0
round(float("123.789")) 

vous donnera une valeur entière, mais un type de flotteur. Avec le typage de canard de Python, cependant, le type réel n'est généralement pas très pertinent. Cela arrondira également la valeur, que vous pourriez ne pas vouloir. Remplacer «rond» par «int» et vous l'aurez juste tronqué et un int réel. Comme ceci:

int(float("123.789")) 

Mais, encore une fois, le «type» réel n'est généralement pas si important.

1

L'expression int(float(s)) mentionnée par d'autres est la meilleure si vous voulez tronquer la valeur.Si vous voulez arrondir, en utilisant si l'algorithme rond correspond à ce que vous voulez (voir le round documentation), sinon vous devriez utiliser Decimal et un si ses algorithmes d'arrondi.

Questions connexes