2010-03-24 15 views
8

Hat jemand einen Quickie zum Umwandeln einer unsicheren Zeichenkette in eine int?Python: Konvertiere eine Zeichenkette in eine Ganzzahl

Die Zeichenfolge kommt in der Regel als: '234\r\n' oder so ähnlich.

In diesem Fall möchte ich 234. Wenn '-1\r\n', möchte ich -1. Ich möchte nie, dass die Methode fehlschlägt, aber ich möchte nicht so weit gehen, es zu versuchen, außer, pass nur um Fehler zu verstecken (falls etwas Extremes passiert).

+5

"Ich möchte nie, dass die Methode fehlschlägt, aber ich möchte nicht so weit gehen wie versuchen, außer, pass nur um Fehler zu verstecken" Das scheint sicherlich widersprüchlich. "Niemals scheitern" bedeutet "Catch Exceptions". Was meinst du mit "Niemals fehlschlagen" und "KEINE Catch-Ausnahmen"? Was ist dieses No-Failure, No-Exception-Ding, das Sie erwarten? Können Sie Ihre Erwartungen klären? –

Antwort

20

In diesem Fall müssen Sie tun, um eine Art und Weise try/except zu vermeiden, obwohl ich es nicht empfehlen würde (vorausgesetzt, Ihr Eingabestring s benannt ist, und Sie in einer Funktion sind, die etwas zurückgeben müssen):

xs = s.strip() 
if xs[0:1] in '+-': xs = xs[1:] 
if xs.isdigit(): return int(s) 
else: ... 

der ... an der else ist, wo Sie zurückkommen, was auch immer es ist, Sie wollen, wenn, sagen wir, s'iamnotanumber' war, '23skidoo', leer, alle Räume oder dergleichen.

Es sei denn viele Ihrer Eingabezeichenfolgen sind nicht-Zahlen, try/except besser ist:

try: return int(s) 
except ValueError: ... 

Sie die Verstärkung in Prägnanz zu sehen, und die knifflig String-Manipulation und Test bei der Vermeidung -)

Ich sehe viele Antworten tun int(s.strip()), aber das ist überflüssig: das Strippen wird nicht benötigt!

>>> int(' 23 ') 
23 

int weiß genug, um zu ignorieren führende und Leerzeichen wie von selbst nachlauf!-)

+6

Ich muss diesen Antwortstatus einfach für die Verwendung des Wortes 'supererogatory' geben –

+1

Statt extraerogatory, vielleicht der strip() ist a Der Fall von "explizit ist besser als implizit". –

+8

@dangph, _redundant_ Operationen sind am besten überhaupt nicht gemacht ;-). –

8

int('243\r\n'.strip())

Aber das wird dir nicht helfen, wenn etwas anderes als eine Zahl übergeben wird. Immer versuchen, außer, und fangen ValueError.

Wie auch immer, das funktioniert auch: int('243\n\r '), vielleicht brauchen Sie nicht einmal strip.

EDIT:

Warum Sie nicht nur Ihre eigene Funktion schreiben, die die Ausnahme und gibt einen vernünftigen Standard und in einige utils Modul fangen?

1
try: 
    x=int("234\r\n".strip()) 
except ValueError: 
    x=0 
+0

In dieser Situation könnte ich auch tun, nur: Versuch: x = int ("234 \ r \ n") außer Valueerror: x = 0 –

+0

Yep; Sie könnten auch, wenn Sie nicht wissen, dass es andere Arten von Zeichenfolgen gibt, die Sie annehmen müssen. –

0

Sie konntest es einfach:

def to_int(unsafe_string): 
    return int(unsafe_string.strip()) 

Aber es wird ein ValueError wenn das abgestreifte unsafe_string ist keine gültige Zahl werfen. Sie können natürlich den ValueError abfangen und damit machen, was Sie wollen.

+0

Ich habe gehofft, dass sowas nativ verfügbar ist. Vielleicht in Django? –

+0

Als Gruszczy erwähnt, scheint es wie 'int ('234 \ r \ n')' funktioniert ohne Streifen, so dass meine Funktion hier völlig redundant ist. – mojbro

+0

Es gibt nichts nativ, da Explicit besser als implizit ist. (aus Zen von Python) –

8
import re 
int(re.sub(r'[^\d-]+', '', your_string)) 

Dies wird alles außer Zahlen und das "-" - Zeichen entfernen. Wenn Sie sicher sein können, dass es außer Leerzeichen keine überzähligen Zeichen gibt, verwenden Sie stattdessen die Methode von gruszczy.

+0

Dies erwies sich tatsächlich als am besten. Ich wurde durch Dinge wie '1234 \ r \ nm' gebissen, die int() –

0

Ohne zu wissen, welche Arten von Eingaben Sie erwarten, ist es schwer zu sagen, was "genug" ist, um dies zu lösen. Wenn Sie nur Sorgen um Hinterzeilenumbrüche sind, dann Xavier Combelle oder des gruszczy Antwort ist genug:

try: 
    x = int(value) 
except ValueError: 
    x = 0 

Wenn Sie irgendeine ganze Zahl zu finden haben, irgendwo in einem String, dann müssen Sie vielleicht etwas wie folgt aus:

import re 
try: 
    x = int(re.search(r'(0|(-?[1-9][0-9]*))', searchstring).group(0)) 
except TypeError: # Catch exception if re.search returns None 
    x = 0 
0

unter Python 3.0 (IDLE) das funktionierte gut

strObj = "234\r\n"
try:
    #a=int(strObj)
except ValueError:
    #a=-1

print(a) >>234


Wenn Sie mit Eingaben arbeiten, denen Sie nicht vertrauen können, sollten Sie es auf keinen Fall tun, dann ist es eine gute Idee, try zu verwenden, außer Blöcke zu übergeben, um Ausnahmen zu steuern, wenn Benutzer inkompatible Daten bereitstellen. Es könnte Ihnen helfen, besser über den Versuch nachzudenken, außer Strukturen als Abwehrmaßnahmen zum Schutz der Datenkompatibilität zu übergeben, anstatt nur Fehler zu verstecken.

try:
    a=int(strObj) #user sets strObj="abc"
except ValueError:
    a=-1

if a != -1:
    #user submitted compatible data
else:
    #inform user of their error

Ich hoffe, das hilft.

0

fn für "str zu float" ist ein bisschen komplizierter, aber ich denke, ich kann es tun, wenn es benötigt wird.

Verwandte Themen