Python: преобразовать строку в целое число - PullRequest
9 голосов
/ 24 марта 2010

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

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

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

Ответы [ 8 ]

21 голосов
/ 24 марта 2010

В этом случае у вас есть способ избежать 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 знает достаточно, чтобы полностью игнорировать начальные и конечные пробелы! -)

9 голосов
/ 24 марта 2010
import re
int(re.sub(r'[^\d-]+', '', your_string))

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

8 голосов
/ 24 марта 2010

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

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

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

EDIT

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

1 голос
/ 24 марта 2010
try:
    x=int("234\r\n".strip())
except ValueError:
    x=0
0 голосов
/ 27 марта 2014
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" немного сложнее, но я думаю, что могу сделать это, если это необходимо.

0 голосов
/ 24 марта 2010

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

strObj = "234 \ r \ n"
попробуйте:
# А = INT (strObj)
кроме ValueError:
# А = -1

печать (а) >> 234


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

попробовать:
a = int (strObj) # пользовательские наборы strObj = "abc"
кроме ValueError:
а = -1

если a! = -1:
# пользователь отправил совместимые данные
еще:
# сообщить пользователю об ошибке

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

0 голосов
/ 24 марта 2010

Не зная, какого рода входные данные вы ожидаете, трудно сказать, что «достаточно», чтобы решить эту проблему. Если вы просто беспокоитесь о конце строки, то достаточно ответа Ксавье Комбелле или Грущчи:

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 голосов
/ 24 марта 2010

Вы можете просто:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...