2010-03-24 15 views
8

¿Alguien tiene un rapidito para convertir una cadena insegura a int?Python: Convierta una cadena en un entero

La cadena generalmente se devuelve como: '234\r\n' o algo así.

En este caso quiero 234. Si '-1\r\n', quiero -1. Nunca quiero que el método falle, pero no quiero ir tan lejos como intentar, excepto, pasar solo para ocultar los errores (en caso de que ocurra algo extremo).

+5

"Nunca quiero que el método falle, pero no quiero ir tan lejos como intentar, excepto, pasar solo para ocultar errores" Eso ciertamente parece contradictorio. "Never Fail" significa "Excepciones de captura". ¿Qué quiere decir con "Never Fail" y "NOT Catch Exceptions"? ¿Qué es esto de no fallas y sin excepciones que estás esperando? ¿Puedes aclarar tus expectativas? –

Respuesta

20

En este caso usted tiene una manera de evitar try/except, aunque yo no lo recomendaría (suponiendo que la cadena de entrada se denomina s, y estás en una función que debe devolver algo):

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

la parte ... en el else es donde regresa lo que sea que quiere si, por ejemplo, s fue 'iamnotanumber', '23skidoo',, todos los espacios vacíos, o similares.

A menos que una gran cantidad de sus cadenas de entrada no eran números, try/except es mejor:

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

se ve la ganancia en la concisión, y para evitar la manipulación de cadenas más incómoda y la prueba -)

Veo muchas respuestas do int(s.strip()), pero eso es supererogatorio: ¡no es necesario pelar!

>>> int(' 23 ') 
23 

int sabe lo suficiente como para ignorar espacio inicial y final por sí mismo!-)

+6

Tengo que dar este estado de respuesta simplemente para el uso de la palabra 'supererogatorio' –

+1

En lugar de ser supererogatorio, tal vez la tira() es una el caso de "explícito es mejor que implícito". –

+8

@dangph, _redundant_ operaciones es mejor no hacer nada ;-). –

8

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

Pero eso no le ayudará, si se pasa algo más que un número. Siempre ponlo a prueba, excepto y captura ValueError.

De todos modos, esto también funciona: int('243\n\r '), por lo que tal vez ni siquiera necesita strip.

EDITAR:

¿Por qué no acaba de escribir su propia función, que captura la excepción y devolver un defecto en su sano juicio y poner en algún módulo de utilidades?

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

En esta situación, puede ser que también acaba de hacer: intento: x = int ("234 \ r \ n") excepto ValueError: x = 0 –

+0

Sí; también podría hacerlo, a menos que sepa que hay otros tipos de cadenas que debe aceptar. –

0

Se podía:

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

Pero va a lanzar una ValueError si el unsafe_string despojado no es un número válido. Por supuesto, puede atrapar el ValueError y hacer lo que quiera con él.

+0

Creo que esperaba que algo como esto estuviera disponible de forma nativa. Tal vez en Django? –

+0

Como mencionó gruszczy, parece que 'int ('234 \ r \ n')' funciona sin tira, por lo que mi función aquí es completamente redundante. – mojbro

+0

No hay nada existente de forma nativa porque Explicit es mejor que implícito. (de Zen of python) –

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

Esto pelará todo excepto los números y el signo "-". Si puede estar seguro de que no habrá ningún exceso de caracteres a excepción de los espacios en blanco, utilice el método de gruszczy en su lugar.

+0

Esto realmente resultó ser lo mejor. Estaba siendo mordido por cosas como '1234 \ r \ nm' que mató int() –

0

Sin saber qué tipo de entradas está esperando, es difícil decir qué es "suficiente" para resolver esto. Si usted está preocupado por detrás de los saltos de línea, entonces la respuesta gruszczy de Xavier Combelle o de es suficiente:

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

Si usted tiene que encontrar cualquier número entero, en cualquier parte de una cadena, entonces puede que tenga algo como esto:

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

En Python 3.0 (IDLE) esto funcionó muy bien

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

print(a) >>234


Si está tratando con una entrada en la que no puede confiar, nunca debería hacerlo de todos modos, entonces es una buena idea usar try, excepto pasar bloques para controlar excepciones cuando los usuarios proporcionan datos incompatibles. Puede que le sirva mejor pensar en intentar, excepto pasar estructuras como medidas defensivas para proteger la compatibilidad de datos en lugar de simplemente ocultar errores.

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

Espero que esto ayude.

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 para "str to float" es un poco más complicado, pero creo que puedo hacerlo si es necesario.

Cuestiones relacionadas