2009-07-07 6 views
41

Ich habe eine Zeichenfolge im Format: 'nn.nnnnn' in Python, und ich möchte es in eine ganze Zahl konvertieren.Konvertiere einen String in Integer mit Dezimal in Python

Direkte Umwandlung fehlschlägt:

>>> 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' 

ich es in eine Dezimalzahl umwandeln kann mit: ‚‘

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

ich auch spalten könnte auf, dann das Dezimalsystem von null subtrahiert, dann füge das zu der ganzen Zahl ... yuck.

Aber ich würde es lieber als int, ohne unnötige Art Konvertierungen oder Manöver haben.

+10

Matt, 23.45678 ist keine Ganzzahl. Wenn Sie möchten, dass Python eine Zeichenfolge in eine Ganzzahl konvertiert, stellen Sie sicher, dass Sie eine Ganzzahl angeben. Man kann argumentieren, was das "Richtige" ist und am Ende wird jemand unglücklich sein. – Christopher

Antwort

88

Wie wäre es damit?

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

Oder ...

>>> int(Decimal(s)) 
23 

Oder ...

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

Ich bezweifle es als viel einfacher zu bekommen geht, fürchte ich. Akzeptiere es einfach und gehe weiter.

+3

Denken Sie daran, 'dezimal zu importieren', dann verwenden Sie es als 'decimal.Decimal (5) 'oder tun' von Dezimalimport Dezimal 'und verwenden Sie es als' Dezimal (5) '. Ich vergesse immer. – teewuane

+0

Sie sollten die Art der Rundung beachten, die jede Option dem Wert bietet. – Rapnar

1

könnten Sie verwenden:

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

Welche Art von Verhalten Rundung wollen Sie? biegen Sie in 3 Haben Sie 2,67, oder 2. Wenn Sie Rundung verwenden möchten, versuchen Sie dies:

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

Ansonsten tun gerade:

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

„Convert“ nur Sinn macht, wenn man von ändern ein Datentyp zu einem anderen ohne Verlust der Wiedergabetreue. Die Zahl, die von der Zeichenfolge dargestellt wird, ist ein Gleitkommawert und verliert die Genauigkeit, wenn sie in einen int-Wert umgewandelt wird.

Sie möchten stattdessen vielleicht runden (ich hoffe, dass die Zahlen keine Währung darstellen, denn dann wird das Runden viel komplizierter).

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 

Sie nicht angeben, wenn Sie Runden wollen oder nicht ...

0
round(float("123.789")) 

geben Ihnen einen Integer-Wert, sondern ein Schwimmer-Typ. Bei Pythons Enten-Typisierung ist der tatsächliche Typ jedoch normalerweise nicht sehr relevant. Dadurch wird auch der Wert abgerundet, den Sie möglicherweise nicht möchten. Ersetzen Sie "rund" durch "int" und Sie werden es nur abgeschnitten und eine tatsächliche int. So ist das:

int(float("123.789")) 

Aber wiederum ist eigentlich "Typ" in der Regel nicht so wichtig.

1

Der von anderen erwähnte Ausdruck int(float(s)) ist der beste, wenn Sie den Wert abschneiden möchten.Wenn Sie Runden möchten, verwenden Sie , wenn der Rundenalgorithmus mit dem übereinstimmt, was Sie wollen (siehe round documentation), andernfalls sollten Sie Decimal und einen der Rundungsalgorithmen verwenden.