2010-03-24 2 views
8

Есть ли у кого-нибудь быстрый способ преобразования небезопасной строки в int?Python: преобразовать строку в целое число

Строка обычно возвращается как: '234\r\n' или что-то в этом роде.

В этом случае я хочу 234. Если '-1\r\n', я хочу -1. Я никогда не хочу, чтобы метод терпит неудачу, но я не хочу заходить так далеко, как пытаюсь, за исключением того, что просто пропускаю ошибки (в случае чего-то экстремального).

+5

«Я никогда не хочу, чтобы метод терпит неудачу, но я не хочу заходить так далеко, как пытаюсь, за исключением того, что он просто скрывает ошибки». Это, безусловно, кажется противоречивым. «Never Fail» означает «Catch Exceptions». Что вы подразумеваете под «Never Fail» и «NOT Catch Exceptions»? Что это за неудачная, без исключения вещь, которую вы ожидаете? Можете ли вы уточнить свои ожидания? –

ответ

20

В этом случае у вас есть способ избежать try/except, хотя я бы не рекомендовал его (предполагается, что входная строка с именем s, и вы в функцию, которая должна вернуть что-то):

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

... часть в else где вы возвращаетесь то, что вы хотите, если, скажем, s был 'iamnotanumber', '23skidoo', пустые, все-пространства, или тому подобное.

Если много ваших входных строк не являются не-числа, попробуйте/кроме лучше:

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

вы видите выигрыш в лаконичности, и избегая неудобный манипуляций со строками и тест -)

Я вижу много ответов int(s.strip()), но это переборчиво: зачистки не нужно!

>>> int(' 23 ') 
23 

int знает достаточно, чтобы игнорировать начальные и конечные пробелы все само по себе!-)

+6

. Мне нужно дать этот статус ответа просто для использования слова «сверхпороговое» –

+1

Вместо того, чтобы быть передовым, возможно, strip() является случай «явный лучше, чем неявный». –

+8

@ dangph, _redundant_ операции лучше всего не делать ;-). –

8

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

Но это не поможет, если что-то другое, чем число передается. Всегда ставьте попытку, кроме и улавливайте ValueError.

В любом случае, это также работает: int('243\n\r '), поэтому, возможно, вам даже не нужно strip.

EDIT:

Почему вы не просто написать свою собственную функцию, которая будет ловить исключение и возвращать вменяемого по умолчанию и положить в какой-Utils модуль?

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

В этой ситуации, я мог бы также просто сделать: попробовать: х = INT ("234 \ г \ п") кроме ValueError: х = 0 –

+0

Да; вы могли бы также, если не знаете, что есть другие типы строк, которые вам нужно принять. –

0

Вы могли бы просто:

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

Но это будет бросать ValueError если раздели unsafe_string не является допустимым числом. Вы можете, конечно, поймать ValueError и делать с ним то, что вам нравится.

+0

Наверное, я надеялся, что что-то подобное получилось изначально. Может быть, в Django? –

+0

Как упоминалось выше, похоже, что 'int ('234 \ r \ n')' работает без полосы, поэтому моя функция здесь полностью избыточна. – mojbro

+0

Ничего не существует изначально, потому что Явный лучше, чем неявный. (от Zen of python) –

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

Это разделит все, кроме цифр и знака «-». Если вы можете быть уверены, что не будет никаких лишних символов, кроме пробелов, используйте вместо этого метод gruszczy.

+0

Это на самом деле оказалось лучшим. Я был укушен такими вещами, как «1234 \ r \ nm», который убил int() –

0

Не зная, какие типы входов вы ожидаете, трудно сказать, что «достаточно» для решения этой проблемы. Если вы просто беспокоюсь о отставая новой строки, то ответ Xavier Combelle в или gruszczy является достаточно:

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

Если вы должны найти любое целое число, в любом месте в строке, то вам может понадобиться что-то вроде этого:

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

Под Python 3.0 (IDLE), это работало хорошо

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

print(a) >>234


Если вы имеете дело с входными данными, вы не можете доверять, вы никогда не должны этого делать, тогда неплохо использовать try, except, pass, чтобы контролировать исключения, когда пользователи предоставляют несовместимые данные. Возможно, вам лучше подумать о попытке, кроме того, передать структуры в качестве защитных мер для защиты совместимости данных, а не просто устранения ошибок.

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

Надеюсь, это поможет.

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 для "str to float" является немного более сложным, но я думаю, что могу сделать это, если это необходимо.

Смежные вопросы