Frage Wie analysiere ich eine Zeichenfolge in Python zu einem Float oder Int?


In Python, wie kann ich eine numerische Zeichenfolge wie analysieren "545.2222" zu seinem entsprechenden Gleitkommawert, 542.2222? Oder analysiere die Zeichenfolge "31" zu einer ganzen Zahl, 31?

Ich will nur wissen, wie man ein Pars analysiert schweben  string zu einem floatund (getrennt) ein int  string zu einem int.


1757
2017-12-19 01:52


Ursprung


Antworten:


>>> a = "545.2222"
>>> float(a)
545.22220000000004
>>> int(float(a))
545

2084
2017-12-19 01:54



def num(s):
    try:
        return int(s)
    except ValueError:
        return float(s)

441
2017-12-19 02:31



Python-Methode, um zu überprüfen, ob eine Zeichenfolge ein Float ist:

def isfloat(value):
  try:
    float(value)
    return True
  except:
    return False

Ein längerer und genauerer Name für diese Funktion könnte sein: isConvertibleToFloat(value)

Was ist, und ist kein Float in Python kann dich überraschen:

val                   isfloat(val) Note
--------------------  ----------   --------------------------------
""                    False        Blank string
"127"                 True         Passed string
True                  True         Pure sweet Truth
"True"                False        Vile contemptible lie
False                 True         So false it becomes true
"123.456"             True         Decimal
"      -127    "      True         Spaces trimmed
"\t\n12\r\n"          True         whitespace ignored
"NaN"                 True         Not a number
"NaNanananaBATMAN"    False        I am Batman
"-iNF"                True         Negative infinity
"123.E4"              True         Exponential notation
".1"                  True         mantissa only
"1,234"               False        Commas gtfo
u'\x30'               True         Unicode is fine.
"NULL"                False        Null is not special
0x3fade               True         Hexadecimal
"6e7777777777777"     True         Shrunk to infinity
"1.797693e+308"       True         This is max value
"infinity"            True         Same as inf
"infinityandBEYOND"   False        Extra characters wreck it
"12.34.56"            False        Only one dot allowed
u'四'                 False        Japanese '4' is not a float.
"#56"                 False        Pound sign
"56%"                 False        Percent of what?
"0E0"                 True         Exponential, move dot 0 places
0**0                  True         0___0  Exponentiation
"-5e-5"               True         Raise to a negative number
"+1e1"                True         Plus is OK with exponent
"+1e1^5"              False        Fancy exponent not interpreted
"+1e1.3"              False        No decimals in exponent
"-+1"                 False        Make up your mind
"(1)"                 False        Parenthesis is bad

Du denkst du weißt was Zahlen sind? Du bist nicht so gut wie du denkst! Keine große Überraschung.


416
2018-01-05 04:15



Dies ist eine andere Methode, die es verdient, hier erwähnt zu werden, ast.literal_eval:

Dies kann verwendet werden, um Strings mit Python-Ausdrücken aus nicht vertrauenswürdigen Quellen sicher zu bewerten, ohne dass die Werte selbst analysiert werden müssen.

Das heißt, eine sichere 'Eval'

>>> import ast
>>> ast.literal_eval("545.2222")
545.2222
>>> ast.literal_eval("31")
31

104
2018-03-01 04:23



float(x) if '.' in x else int(x)

74
2017-12-19 02:32



Lokalisierung und Kommas

Sie sollten die Möglichkeit von Kommas in der String-Darstellung einer Zahl berücksichtigen, für Fälle wie float("545,545.2222") was eine Ausnahme auslöst. Verwenden Sie stattdessen Methoden in locale um die Strings in Zahlen zu konvertieren und Kommas korrekt zu interpretieren. Das locale.atof Die Methode wird in einem Schritt in einen Float konvertiert, sobald das Gebietsschema für die gewünschte Zahlenkonvention festgelegt wurde.

Beispiel 1 - Nummernkonventionen der Vereinigten Staaten 

In den Vereinigten Staaten und Großbritannien können Kommas als Tausendertrennzeichen verwendet werden. In diesem Beispiel mit amerikanischem Gebietsschema wird das Komma ordnungsgemäß als Trennzeichen behandelt:

>>> import locale
>>> a = u'545,545.2222'
>>> locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.atof(a)
545545.2222
>>> int(locale.atof(a))
545545
>>>

Beispiel 2 - Europäische Nummernkonventionen

In dem Mehrheit der Länder der WeltKommas werden für Dezimalzeichen anstelle von Punkten verwendet. In diesem Beispiel mit französischem Gebietsschema wird das Komma korrekt als Dezimaltrennzeichen behandelt:

>>> import locale
>>> b = u'545,2222'
>>> locale.setlocale(locale.LC_ALL, 'fr_FR')
'fr_FR'
>>> locale.atof(b)
545.2222

Die Methode locale.atoi ist ebenfalls verfügbar, aber das Argument sollte eine ganze Zahl sein.


45
2017-07-23 16:00



Benutzer Codelogik und Harley sind korrekt, aber bedenken Sie, wenn Sie wissen, dass die Zeichenfolge eine Ganzzahl ist (z. B. 545), können Sie int ("545") aufrufen, ohne zuerst zu floaten.

Wenn sich Ihre Strings in einer Liste befinden, können Sie auch die Kartenfunktion verwenden.

>>> x = ["545.0", "545.6", "999.2"]
>>> map(float, x)
[545.0, 545.60000000000002, 999.20000000000005]
>>>

Es ist nur gut, wenn sie alle vom selben Typ sind.


22
2017-12-19 02:09



Wenn Sie Module von Drittanbietern nicht ablehnen, können Sie die Fastnummern Modul. Es bietet eine Funktion namens schnell_real Das macht genau das, wonach diese Frage gefragt ist, und zwar schneller als eine reine Python-Implementierung:

>>> from fastnumbers import fast_real
>>> fast_real("545.2222")
545.2222
>>> type(fast_real("545.2222"))
float
>>> fast_real("31")
31
>>> type(fast_real("31"))
int

21
2017-08-14 03:21