web-dev-qa-db-fra.com

Convertir une chaîne en entier avec un nombre décimal en Python

J'ai une chaîne au format: 'nn.nnnnn' en Python, et j'aimerais la convertir en un entier.

La 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 décimal en utilisant:

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

Je pourrais aussi diviser sur '.', Puis soustraire la décimale à zéro, puis l'ajouter au nombre entier ... beurk.

Mais je préférerais l'avoir comme un int, sans conversions de type inutiles ni manœuvres.

48
Matt Hampel

Que dis-tu de ça?

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

Ou...

>>> int(Decimal(s))
23

Ou...

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

Je doute que cela deviendra beaucoup plus simple que cela, j'en ai bien peur. Accepte-le et passe à autre chose.

97
Paolo Bergantino

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

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

Sinon, il suffit de:

s = '234.67'
i = int(float(s))
13
Dan Lorenc
>>> 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 précisez pas si vous voulez arrondir ou non ...

3
Kevin Little

"Convertir" n'a de sens que lorsque vous passez d'un type de données à un autre sans perte de fidélité. Le nombre représenté par la chaîne est un float et perdra de la précision s'il est forcé d'entrer dans un int.

Vous voulez plutôt arrondir, probablement (j'espère que les chiffres ne représentent pas la monnaie, car l'arrondir devient beaucoup plus compliqué).

round(float('23.45678'))
2
JosefAssad

Vous pouvez utiliser:

s = '23.245678'
i = int(float(s))
1
gbc

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

1
Kathy Van Stone
round(float("123.789"))

vous donnera une valeur entière, mais un type float. Cependant, avec Python, le type réel n’est généralement pas très pertinent. Cela arrondira également la valeur, ce que vous ne voudrez peut-être pas. Remplacez 'round' par 'int' et vous l'aurez simplement tronqué et un int réel. Comme ça:

int(float("123.789"))

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

0
rledley