-
Wie kann ich eine
str
afloat
?"545.2222" 545.2222
-
Wie kann ich eine
str
aint
?"31" 31
Gutes Argument. Das führt allerdings zu Inflation, also Python 3 et andere moderne Sprachen die Rundung der Bank verwenden.
Wie kann ich eine str
a float
?
"545.2222" 545.2222
Wie kann ich eine str
a int
?
"31" 31
Gutes Argument. Das führt allerdings zu Inflation, also Python 3 et andere moderne Sprachen die Rundung der Bank verwenden.
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!
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
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)
.
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)
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.
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 Beispieltype(100)
führt zuint
so können Sie anrufenint(my_object)
zu versuchen, zu konvertierenmy_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'
.0 Stimmen
Int(x) if int(float(x)) == float(x) else float(x)