2721 Stimmen

Wie kann ich eine Zeichenkette in einen Float oder Int parsen?

  • Wie kann ich eine str a float ?

    "545.2222"    545.2222
  • Wie kann ich eine str a int ?

    "31"          31

19 Stimmen

Generell gilt: Wenn Sie ein Objekt in Python haben und es umwandeln wollen, müssen Sie zu diese Art von Objekt, rufen Sie type(my_object) darauf. Das Ergebnis kann normalerweise als Funktion aufgerufen werden, um die Konvertierung durchzuführen. Zum Beispiel type(100) führt zu int so können Sie anrufen int(my_object) zu versuchen, zu konvertieren my_object in eine ganze Zahl umgewandelt. Das funktioniert nicht immer, ist aber eine gute "erste Vermutung" beim Programmieren.

6 Stimmen

int(x) if int(x) == float(x) else float(x)

5 Stimmen

@tcpaiva ValueError: invalid literal for int() with base 10: '1.5' .

6voto

Cybernetic Punkte 10978

Übergeben Sie Ihre Zeichenkette an diese Funktion:

def string_to_number(str):
  if("." in str):
    try:
      res = float(str)
    except:
      res = str  
  elif(str.isdigit()):
    res = int(str)
  else:
    res = str
  return(res)

Es gibt int, float oder string zurück, je nachdem, was übergeben wurde.

Zeichenkette, die ein int ist

print(type(string_to_number("124")))
<class 'int'>

Zeichenkette, die ein Float ist

print(type(string_to_number("12.4")))
<class 'float'>

Zeichenkette, die eine Zeichenkette ist

print(type(string_to_number("hello")))
<class 'str'>

Zeichenkette, die wie ein Float aussieht

print(type(string_to_number("hel.lo")))
<class 'str'>

3 Stimmen

Wenn man sich den Namen string_to_number Ich würde nicht erwarten, dass es eine Zeichenkette zurückgibt. Ich würde erwarten, dass es eine Exception auslöst, wenn die Eingabe nicht geparst werden kann

1 Stimmen

Ich denke nicht, dass es eine kontroverse Meinung ist, dass eine Methode namens string_to_number keine Zeichenkette zurückgeben sollte. Ich habe heruntergevotet, weil die Funktion entweder schlecht benannt ist oder ihr Verhalten falsch ist. Außerdem gibt es keinen Grund, passiv aggressiv zu sein. Wir können das auf professionelle Weise ausdiskutieren.

4voto

bougui Punkte 3131
a = int(float(a)) if int(float(a)) == float(a) else float(a)

0 Stimmen

Eine Erklärung wäre angebracht. Was ist z. B. die Idee/der Kern? Wo liegen die Grenzen, wenn überhaupt? Wie wäre es mit einigen Tests, um zu zeigen, dass es funktioniert? Von das Hilfe-Center : "...erklären Sie immer, warum die von Ihnen vorgestellte Lösung angemessen ist und wie sie funktioniert" . Bitte antworten Sie bis Bearbeitung (Änderung) Ihrer Antwort , nicht hier in den Kommentaren ( ohne "Bearbeiten:", "Aktualisieren:" oder ähnlich - die Antwort sollte so aussehen, als wäre sie heute geschrieben worden).

3voto

Kuzeko Punkte 1355

Dies ist eine korrigierte Fassung von https://stackoverflow.com/a/33017514/5973334

Dies versucht, eine Zeichenkette zu analysieren und gibt entweder int o float je nachdem, wofür die Zeichenfolge steht. Es könnte zu Parsing-Ausnahmen oder haben ein unerwartetes Verhalten .

  def get_int_or_float(v):
        number_as_float = float(v)
        number_as_int = int(number_as_float)
        return number_as_int if number_as_float == number_as_int else 
        number_as_float

2voto

Sameh Farouk Punkte 479

Dies ist eine alte Frage und hat schon viele Antworten bekommen. aber wenn Sie mit gemischten Ganzzahlen und Fließkommazahlen zu tun haben und einen konsistenten Weg für den Umgang mit Ihren gemischten Daten suchen, hier ist meine Lösung mit dem richtigen docstring:

def parse_num(candidate):
    """parse string to number if possible
    work equally well with negative and positive numbers, integers and floats.

    Args:
        candidate (str): string to convert

    Returns:
        float | int | None: float or int if possible otherwise None
    """
    try:
        float_value = float(candidate)
    except ValueError:
        return None

    # optional part if you prefer int to float when decimal part is 0 
    if float_value.is_integer():
        return int(float_value)
    # end of the optional part

    return float_value

# test
candidates = ['34.77', '-13', 'jh', '8990', '76_3234_54']
res_list = list(map(parse_num, candidates))
print('Before:')
print(candidates)
print('After:')
print(res_list)

Ausgabe:

Before:
['34.77', '-13', 'jh', '8990', '76_3234_54']
After:
[34.77, -13, None, 8990, 76323454]

1voto

SeasonalShot Punkte 1928

Verwendung:

def num(s):
    try:
        for each in s:
            yield int(each)
    except ValueError:
        yield float(each)
a = num(["123.55","345","44"])
print a.next()
print a.next()

Das ist der pythonischste Weg, den ich mir vorstellen kann.

1 Stimmen

Der Generator stoppt nach der ersten Interpretation von float . Die try catch Block sollte sich wahrscheinlich innerhalb der for Schleife.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X