2010-03-24 14 views
8

Qualcuno ha una sveltina per convertire una stringa non sicura in uno int?Python: Convertire una stringa in un numero intero

La stringa in genere torna come: '234\r\n' o qualcosa del genere.

In questo caso voglio 234. Se '-1\r\n', voglio -1. Non voglio mai che il metodo fallisca, ma non voglio andare oltre quanto provare, tranne, passare solo per nascondere gli errori (nel caso succeda qualcosa di estremo).

+5

"Non voglio mai che il metodo fallisca, ma non voglio andare così lontano come provare, tranne, passare solo per nascondere gli errori" Questo certamente sembra contraddittorio. "Never Fail" significa "Eccezioni di cattura". Cosa intendi per "Never Fail" e "NOT Catch Exceptions"? Cos'è questa cosa senza eccezioni, senza eccezioni che ti aspetti? Puoi chiarire le tue aspettative? –

risposta

20

In questo caso si ha un modo per evitare try/except, anche se io non lo consiglio (supponendo che lo stringa di input è chiamato s, e tu sei in una funzione che deve restituire qualcosa):

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

la parte ... nel else è dove si ritorna tutto ciò che vuoi se, per esempio, era s'iamnotanumber', '23skidoo', vuoto, tutti-gli spazi, o simili.

A meno che un sacco di vostri stringhe di input sono i non-numeri, provare/eccezione è meglio:

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

si vede il guadagno in concisione, e ad evitare la manipolazione di stringhe poco pratici e di prova -)

Vedo molte risposte int(s.strip()), ma questa è una supererogazione: lo spogliamento non è necessario!

>>> int(' 23 ') 
23 

int sa abbastanza per ignorare spazi iniziali e finali da sola!-)

+6

Devo dare questo stato di risposta semplicemente per l'uso della parola 'supererogatorio' –

+1

Invece di essere supererogatorio, forse la striscia() è un caso di "esplicito è meglio di implicito". –

+8

@dangph, le operazioni _redundant_ non sono affatto ottimali ;-). –

8

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

Ma questo non vi aiuterà, se viene passato qualcosa di diverso da un numero. Metti sempre prova, tranne e cattura ValueError.

In ogni caso, questo funziona anche: int('243\n\r '), quindi forse non è nemmeno necessario strip.

EDIT:

Perché non basta scrivere la propria funzione, che cattura l'eccezione e restituire un valore predefinito sano e mettere in qualche modulo utils?

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

In questa situazione, potrei anche fare solo: prova: x = int ("234 \ r \ n") eccezione ValueError: x = 0 –

+0

Yep; potresti anche, a meno che tu non sappia che ci sono altri tipi di stringhe che devi accettare. –

0

si può solo:

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

Ma sarà gettare un ValueError se il spogliato unsafe_string non è un numero valido. Ovviamente puoi prendere l'errore ValueError e fare ciò che ti piace con esso.

+0

Credo che speravo che qualcosa del genere fosse disponibile in modo nativo. Forse a Django? –

+0

Come accennato da gruszczy, sembra che 'int ('234 \ r \ n')' funzioni senza strip, quindi la mia funzione qui è completamente ridondante. – mojbro

+0

Non esiste nulla in modo nativo perché Explicit è migliore di implicito. (da Zen di python) –

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

Questo rimuoverà tutto tranne i numeri e il segno "-". Se si può essere sicuri che non ci saranno mai caratteri in eccesso tranne che per gli spazi bianchi, usare invece il metodo di gruszczy.

+0

Questo in realtà si è rivelato essere il migliore. Sono stato morso da cose come '1234 \ r \ nm' che hanno ucciso int() –

0

Senza sapere quali tipi di input ci si aspetta, è difficile dire cosa sia 'sufficiente' per risolvere questo problema. Se sono solo preoccupati di uscita a capo, quindi la risposta di Xavier Combelle o gruszczy di basta:

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

Se dovete trovare qualsiasi numero intero, in qualsiasi punto di una stringa, quindi potrebbe essere necessario qualcosa di simile:

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

sotto Python 3.0 (IDLE) questo ha funzionato bene

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

print(a) >>234


Se hai a che fare con l'input non puoi fidarti, non dovresti mai comunque, quindi è una buona idea usare try, tranne, passare blocchi per controllare le eccezioni quando gli utenti forniscono dati incompatibili. Potrebbe darti il ​​meglio per pensare di provare, tranne, passare le strutture come misure difensive per proteggere la compatibilità dei dati piuttosto che semplicemente gli errori di hidding.

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

Spero che questo aiuti.

0
def str_to_int(a): 
    str_to_int_output="" 
    for i in range(len(a)): 
     for b in range(10): 
      if a[i]==str(b): 
       str_to_int_output+=a[i] 
    return int(str_to_int_output) 

fn per "str a float" è un po 'più complicato, ma penso di poterlo fare se è necessario.

Problemi correlati