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

9voto

Jerry T Punkte 1336
def num(s):
    """num(s)
    num(3),num(3.7)-->3
    num('3')-->3, num('3.7')-->3.7
    num('3,700')-->ValueError
    num('3a'),num('a3'),-->ValueError
    num('3e4') --> 30000.0
    """
    try:
        return int(s)
    except ValueError:
        try:
            return float(s)
        except ValueError:
            raise ValueError('argument is not a string of number')

8voto

Nick Punkte 26768

Um dies richtig zu tun, müssen Sie die Rundung berücksichtigen.

d.h.. int(5.1) => 5 int(5.6) => 5 - falsch, sollte 6 sein, also tun wir es int(5.6 + 0.5) => 6

def convert(n):
    try:
        return int(n)
    except ValueError:
        return float(n + 0.5)

4 Stimmen

Gutes Argument. Das führt allerdings zu Inflation, also Python 3 et andere moderne Sprachen die Rundung der Bank verwenden.

2 Stimmen

Diese Antwort ist (wie ursprünglich geschrieben) falsch. Sie verwirrt die beiden Fälle von int et float . Und es wird eine Ausnahme geben, wenn n ist eine Zeichenkette, wie von OP gewünscht. Vielleicht meinten Sie: Wenn eine int Ergebnis gewünscht wird, round sollte NACH der Umwandlung in Float durchgeführt werden. Wenn die Funktion IMMER einen int zurückgeben soll, dann brauchen Sie den except-Teil nicht - der gesamte Funktionskörper kann int(round(float(input))) . Wenn die Funktion einen int zurückgeben soll, wenn möglich, sonst einen float, dann ist die ursprüngliche Lösung von javier richtig!

0 Stimmen

ValueError: String konnte nicht in Float konvertiert werden

7voto

Sławomir Lenart Punkte 6134

Ich bin überrascht, dass niemand regex erwähnt, weil manchmal Zeichenfolge muss vorbereitet und normalisiert werden, bevor Casting zu Zahl

import re
def parseNumber(value, as_int=False):
    try:
        number = float(re.sub('[^.\-\d]', '', value))
        if as_int:
            return int(number + 0.5)
        else:
            return number
    except ValueError:
        return float('nan')  # or None if you wish

Verwendung:

parseNumber('13,345')
> 13345.0

parseNumber('- 123 000')
> -123000.0

parseNumber('99999\n')
> 99999.0

und übrigens, etwas, um zu überprüfen, ob Sie eine Nummer haben:

import numbers
def is_number(value):
    return isinstance(value, numbers.Number)
    # will work with int, float, long, Decimal

6voto

kCODINGeroo Punkte 404

An typecast in Python verwenden Sie die Konstruktorfunktionen des Typs und übergeben die Zeichenkette (oder den Wert, den Sie zu casten versuchen) als Parameter.

Zum Beispiel:

>>>float("23.333")
   23.333

Hinter den Kulissen ruft Python die Objekte __float__ Methode, die eine Float-Darstellung des Parameters zurückgeben sollte. Dies ist besonders leistungsfähig, da Sie Ihre eigenen Typen (mit Klassen) mit einer __float__ Methode, so dass sie in einen Float umgewandelt werden kann. float(myobject) .

6voto

shrewmouse Punkte 4278

Verarbeitet hexadezimal, oktal, binär, dezimal und float

Diese Lösung behandelt alle Zeichenkettenkonventionen für Zahlen (alle, von denen ich weiß).

def to_number(n):
    ''' Convert any number representation to a number 
    This covers: float, decimal, hex, and octal numbers.
    '''

    try:
        return int(str(n), 0)
    except:
        try:
            # python 3 doesn't accept "010" as a valid octal.  You must use the
            # '0o' prefix
            return int('0o' + n, 0)
        except:
            return float(n)

Die Ausgabe dieses Testfalls veranschaulicht, wovon ich spreche.

======================== CAPTURED OUTPUT =========================
to_number(3735928559)   = 3735928559 == 3735928559
to_number("0xFEEDFACE") = 4277009102 == 4277009102
to_number("0x0")        =          0 ==          0
to_number(100)          =        100 ==        100
to_number("42")         =         42 ==         42
to_number(8)            =          8 ==          8
to_number("0o20")       =         16 ==         16
to_number("020")        =         16 ==         16
to_number(3.14)         =       3.14 ==       3.14
to_number("2.72")       =       2.72 ==       2.72
to_number("1e3")        =     1000.0 ==       1000
to_number(0.001)        =      0.001 ==      0.001
to_number("0xA")        =         10 ==         10
to_number("012")        =         10 ==         10
to_number("0o12")       =         10 ==         10
to_number("0b01010")    =         10 ==         10
to_number("10")         =         10 ==         10
to_number("10.0")       =       10.0 ==         10
to_number("1e1")        =       10.0 ==         10

Hier ist der Test:

class test_to_number(unittest.TestCase):

    def test_hex(self):
        # All of the following should be converted to an integer
        #
        values = [

                 #          HEX
                 # ----------------------
                 # Input     |   Expected
                 # ----------------------
                (0xDEADBEEF  , 3735928559), # Hex
                ("0xFEEDFACE", 4277009102), # Hex
                ("0x0"       ,          0), # Hex

                 #        Decimals
                 # ----------------------
                 # Input     |   Expected
                 # ----------------------
                (100         ,        100), # Decimal
                ("42"        ,         42), # Decimal
            ]

        values += [
                 #        Octals
                 # ----------------------
                 # Input     |   Expected
                 # ----------------------
                (0o10        ,          8), # Octal
                ("0o20"      ,         16), # Octal
                ("020"       ,         16), # Octal
            ]

        values += [
                 #        Floats
                 # ----------------------
                 # Input     |   Expected
                 # ----------------------
                (3.14        ,       3.14), # Float
                ("2.72"      ,       2.72), # Float
                ("1e3"       ,       1000), # Float
                (1e-3        ,      0.001), # Float
            ]

        values += [
                 #        All ints
                 # ----------------------
                 # Input     |   Expected
                 # ----------------------
                ("0xA"       ,         10), 
                ("012"       ,         10), 
                ("0o12"      ,         10), 
                ("0b01010"   ,         10), 
                ("10"        ,         10), 
                ("10.0"      ,         10), 
                ("1e1"       ,         10), 
            ]

        for _input, expected in values:
            value = to_number(_input)

            if isinstance(_input, str):
                cmd = 'to_number("{}")'.format(_input)
            else:
                cmd = 'to_number({})'.format(_input)

            print("{:23} = {:10} == {:10}".format(cmd, value, expected))
            self.assertEqual(value, expected)

0 Stimmen

ValueError: String konnte nicht in Float konvertiert werden

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