← Все вопросы

Как проверить, что строка — корректное число (с минусом и точкой)? isdigit не подходит

Задан 13 месяцев назад825 просмотров4 ответа
18

Пользователь вводит '-3.14', а isdigit() возвращает False из-за минуса и точки. Как нормально проверить, что строку можно превратить в число?

4 ответа

27
✓ Принятый ответ — помог автору

isdigit() для дробных и отрицательных не работает в принципе. Самый надёжный способ — попробовать сконвертировать и поймать ошибку:

def is_number(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

is_number('-3.14')  # True
is_number('1e5')    # True
is_number('abc')    # False

Это покрывает минус, точку, экспоненту и пробелы по краям — всё, что понимает сам float. Подход «легче попросить прощения, чем разрешения» — очень питоничный.

Евгений Курмыса float('nan') и float('inf') тоже пройдут — иногда это не нужно · 13 месяцев назад
Данил Киселёв EAFP рулит, регуляркой замучаешься все случаи описывать · 13 месяцев назад
9

Если именно целое со знаком — можно регуляркой: re.fullmatch(r'-?\d+', s). Для дробных: r'-?\d+(\.\d+)?'. Но try/float проще и надёжнее.

4

Через try: float(s).

-5

Используй s.isdigit(). (не сработает с минусом и точкой — именно поэтому автор и спрашивает)

Анна Королёва Так в этом и проблема, isdigit как раз не годится · 13 месяцев назад

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект