pyarg_parsetupleandkeywords - python raw string variable




Wie analysiere ich eine Zeichenfolge in Python zu einem Float oder Int? (15)

Wie kann ich in Python eine numerische Zeichenfolge wie "545.2222" zu dem entsprechenden Gleitkommawert, 542.2222, analysieren? Oder parsen Sie die Zeichenfolge "31" zu einer Ganzzahl, 31? Ich will nur wissen, wie man eine Float-Zeichenfolge zu einem Float und (separat) eine int-Zeichenfolge zu einem Int analysieren.

Es ist gut, dass Sie bitten, diese separat zu machen. Wenn Sie sie mischen, können Sie sich später auf Probleme einstellen. Die einfache Antwort ist:

"545.2222" zu floaten:

>>> float("545.2222")
545.2222

"31" zu einer Ganzzahl:

>>> int("31")
31

Andere Konvertierungen, Ints zu und von Strings und Literalen:

Conversions von verschiedenen Basen, und Sie sollten die Basis im Voraus kennen (10 ist die Standardeinstellung). Beachten Sie, dass Sie ihnen das voranstellen können, was Python für ihre Literale erwartet (siehe unten), oder entfernen Sie das Präfix:

>>> int("0b11111", 2)
31
>>> int("11111", 2)
31
>>> int('0o37', 8)
31
>>> int('37', 8)
31
>>> int('0x1f', 16)
31
>>> int('1f', 16)
31

Wenn Sie die Basis nicht im Voraus kennen, aber wissen, dass sie das richtige Präfix haben wird, kann Python dies für Sie ableiten, wenn Sie 0 als Basis übergeben:

>>> int("0b11111", 0)
31
>>> int('0o37', 0)
31
>>> int('0x1f', 0)
31

Nicht-Dezimal (dh Integer) Literale aus anderen Basen

Wenn Ihre Motivation darin besteht, dass Ihr eigener Code klar codierte spezifische Werte darstellt, müssen Sie möglicherweise nicht von den Grundlagen konvertieren - Sie können Python dies automatisch für Sie mit der richtigen Syntax erledigen lassen.

Sie können die apropos-Präfixe verwenden, um eine automatische Konvertierung in Ganzzahlen mit den folgenden Literalen zu erhalten . Diese gelten für Python 2 und 3:

Binär, Präfix 0b

>>> 0b11111
31

Oktal, Präfix 0o

>>> 0o37
31

Hexadezimal, Präfix 0x

>>> 0x1f
31

Dies kann hilfreich sein, wenn Sie binäre Flags, Dateiberechtigungen im Code oder Hexadezimalwerte für Farben beschreiben - z. B. no quotes:

>>> 0b10101 # binary flags
21
>>> 0o755 # read, write, execute perms for owner, read & ex for group & others
493
>>> 0xffffff # the color, white, max values for red, green, and blue
16777215

Mehrdeutige Python 2-Oktale mit Python 3 kompatibel machen

Wenn Sie eine Ganzzahl sehen, die mit einer 0 beginnt, ist dies in Python 2 die (veraltete) Oktalsyntax.

>>> 037
31

Es ist schlecht, weil es so aussieht, als sollte der Wert 37 . In Python 3 löst es jetzt einen SyntaxError :

>>> 037
  File "<stdin>", line 1
    037
      ^
SyntaxError: invalid token

Konvertieren Sie Ihre Python 2-Oktalen in Oktalen, die sowohl in 2 als auch in 3 mit dem Präfix 0o :

>>> 0o37
31

Wie kann ich in Python eine numerische Zeichenfolge wie "545.2222" zu dem entsprechenden 542.2222 , 542.2222 , 542.2222 ? Oder parsen Sie die Zeichenfolge "31" zu einer Ganzzahl, 31 ?

Ich will nur wissen, wie man eine Float- string zu einem float und (separat) eine int- string zu einem int analysieren.


Lokalisierung und Kommas

Sie sollten die Möglichkeit von Kommas in der Zeichenfolgendarstellung einer Zahl berücksichtigen, für Fälle wie float("545,545.2222") die eine Ausnahme float("545,545.2222") . Verwenden Sie stattdessen Methoden in der locale , um die Zeichenfolgen in Zahlen zu konvertieren und Kommas korrekt zu interpretieren. Die locale.atof Methode wird in einem Schritt in float konvertiert, sobald das Gebietsschema für die gewünschte locale.atof 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 den meisten Ländern der Welt werden Kommas anstelle von Punkten als Dezimalzeichen 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 Ganzzahl sein.


Benutzen:

>>> str_float = "545.2222"
>>> float(str_float)
545.2222
>>> type(_) # Check its type
<type 'float'>

>>> str_int = "31"
>>> int(str_int)
31
>>> type(_) # Check its type
<type 'int'>

Benutzen:

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()

Dies ist der pythischste Weg, den ich mir vorstellen kann.


Der YAML Parser kann Ihnen helfen, herauszufinden, welcher Datentyp Ihre Zeichenfolge ist. Verwenden Sie yaml.load() , und dann können Sie type(result) , um nach type zu testen:

>>> import yaml

>>> a = "545.2222"
>>> result = yaml.load(a)
>>> result
545.22220000000004
>>> type(result)
<type 'float'>

>>> b = "31"
>>> result = yaml.load(b)
>>> result
31
>>> type(result)
<type 'int'>

>>> c = "HI"
>>> result = yaml.load(c)
>>> result
'HI'
>>> type(result)
<type 'str'>

Die Frage scheint ein bisschen alt zu sein. Aber lassen Sie mich eine Funktion vorschlagen, parseStr, die etwas Ähnliches macht, das heißt, gibt Integer oder Float zurück und wenn eine gegebene ASCII-Zeichenkette nicht in keine von ihnen konvertiert werden kann, wird sie unberücksichtigt gelassen. Der Code könnte natürlich angepasst werden, um nur das zu tun, was Sie wollen:

   >>> import string
   >>> parseStr = lambda x: x.isalpha() and x or x.isdigit() and \
   ...                      int(x) or x.isalnum() and x or \
   ...                      len(set(string.punctuation).intersection(x)) == 1 and \
   ...                      x.count('.') == 1 and float(x) or x
   >>> parseStr('123')
   123
   >>> parseStr('123.3')
   123.3
   >>> parseStr('3HC1')
   '3HC1'
   >>> parseStr('12.e5')
   1200000.0
   >>> parseStr('12$5')
   '12$5'
   >>> parseStr('12.2.2')
   '12.2.2'

Hier ist eine andere Interpretation Ihrer Frage (Hinweis: es ist vage). Es ist möglich, dass du nach etwas suchst:

def parseIntOrFloat( aString ):
    return eval( aString )

Es funktioniert so ...

>>> parseIntOrFloat("545.2222")
545.22220000000004
>>> parseIntOrFloat("545")
545

Theoretisch gibt es eine Injektionsanfälligkeit. Die Zeichenfolge könnte beispielsweise "import os; os.abort()" . Ohne Hintergrundwissen darüber, woher die Saite kommt, besteht jedoch die Möglichkeit theoretischer Spekulationen. Da die Frage vage ist, ist es überhaupt nicht klar, ob diese Sicherheitsanfälligkeit tatsächlich existiert oder nicht.


Ich benutze diese Funktion dafür

import ast

def parse_str(s):
   try:
      return ast.literal_eval(str(s))
   except:
      return

Es konvertiert die Zeichenfolge in ihren Typ

value = parse_str('1')  # Returns Integer
value = parse_str('1.5')  # Returns Float

Python hat diese große Flexibilität beim Parsing in einem Liner.

str = "545.2222"
print ("int: ", + int(float(a)))
print ("float: ", +(float(a)))

Sie müssen das Runden berücksichtigen, um dies richtig zu machen.

Dh int (5.1) => 5 int (5.6) => 5 - falsch, sollte 6 sein, also tun wir int (5.6 + 0.5) => 6

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

float("545.2222") und int(float("545.2222"))


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

Dies wird versuchen, einen String zu analysieren und entweder int oder float abhängig davon, was der String darstellt. Es könnte zu einer Analyse von Ausnahmen oder zu unerwartetem Verhalten kommen .

  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

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

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

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






integer