Выбор между методами Python isdigit(), isnumeric() и isdecimal()

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

После прочтения этой статьи вы узнаете:

  • Что делают методы .isdigit(), .isnumeric() и .isdecimal(), каковы их ограничения и области применения

  • Различия между тремя методами и случаи, когда они могут работать не совсем так, как ожидается

Оглавление:

Python isdigit: Как работает

Метод isdigit() возвращает True, если все символы в строке являются цифрами, и False в противном случае.

Давайте рассмотрим несколько примеров, чтобы понять, как работает метод:

pythonCopy# Python .isdigit() для проверки, все ли символы являются цифрами

# Если все символы - цифры, .isdigit() возвращает True
>>> '123'.isdigit()
True

# Если не все символы - цифры, .isdigit() возвращает False
>>> '123abc'.isdigit()
False

# Если есть пробел, .isdigit() возвращает False
>>> ' 123'.isdigit()
False

# Если есть десятичная точка, .isdigit() возвращает False
>>> '1.23'.isdigit()
False

Из приведенных примеров видно, что метод isdigit() имеет некоторые особенности:

  • Если все символы являются цифрами, метод возвращает True

  • Если символ - пробел или десятичная точка, метод возвращает False

Интересно отметить, что метод isdigit() также работает с надстрочными символами и показателями степени, даже когда они представлены в юникод-версии:

pythonCopy# Python isdigit работает с показателями степени

# Загружаем значение для куба
>>> cubed = "\u00B2"

# Проверяем, является ли это цифрой с помощью Python .isdigit()
>>> cubed.isdigit()
True

Python isnumeric: Как работает

Метод isnumeric() имеет ряд ключевых отличий от метода isdigit(). Если isdigit() проверяет, содержит ли строка только цифры, то isnumeric() проверяет, являются ли все символы числовыми.

Принципиальное различие заключается в том, что isnumeric() может работать с такими элементами, как юникод-дроби и римские цифры, при условии, что все символы в строке являются числовыми значениями.

Давайте посмотрим, как работает метод isnumeric():

pythonCopy# Python isnumeric для проверки числовых значений символов

# Проверка, является ли строка с целым числом числовой
>>> integer = '2'
>>> print(f'{integer.isnumeric()=}')
integer.isnumeric()=True

# Проверка, является ли строка с числом с плавающей точкой числовой
>>> floats = '2.3'
>>> print(f'{floats.isnumeric()=}')
floats.isnumeric()=False

# Проверка, является ли строка с дробью числовой
>>> fraction = '⅔'
>>> print(f'{fraction.isnumeric()=}')
fraction.isnumeric()=True

# Проверка, является ли строка с показателем степени числовой
>>> exponent = '2²'
>>> print(f'{exponent.isnumeric()=}')
exponent.isnumeric()=True

Python isdecimal: Как работает

Метод isdecimal() несколько отличается, посколько оценивает, является ли символ десятичным символом, а не числовым символом. Из-за этого он вернет True, только если все символы могут быть представлены десятичным числом, то есть дроби и надстрочные символы будут возвращать False.

pythonCopy# Python isdecimal для проверки десятичных значений

# Проверка, является ли строка с целым числом десятичной
>>> integer = '2'
>>> print(f'{integer.isdecimal()=}')
integer.isdecimal()=True

# Проверка, является ли строка с числом с плавающей точкой десятичной
>>> floats = '2.3'
>>> print(f'{floats.isdecimal()=}')
floats.isdecimal()=False

# Проверка, является ли строка с дробью десятичной
>>> fraction = '⅔'
>>> print(f'{fraction.isdecimal()=}')
fraction.isdecimal()=False

# Проверка, является ли строка с показателем степени десятичной
>>> exponent = '2²'
>>> print(f'{exponent.isdecimal()=}')
exponent.isdecimal()=False

Мы видим, что метод isdecimal однозначно определяет, что он считает десятичными числами. Это может быть очень полезно, если вы хотите возвращать только значения в десятичной системе счисления.

Различия между Python isdigit, isnumeric, isdecimal

Таблица ниже показывает ключевые различия между методами isdigit, isnumeric и isdecimal, которые могут использоваться для определения различий, связанных с числами в строках

Важно отметить, что: проверка на истинность происходит в порядке isdecimal, isdigit, затем isnumeric – это означает, что всё, что истина для isdecimal, будет истино и для следующих двух. Всё, что истина для isdigit, будет истино для isnumeric

Тип строки

Пример

Python .isdecimal()

Python .isdigit()

Python .isnumeric()

Десятичные числа

'0123'

True

True

True

Дроби и верхние индексы

'⅔', '2²'

False

True

True

Римские цифры

'ↁ'

False

False

True

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

Проверка числа с плавающей точкой

Самый простой способ проверить, представляет ли строка число с плавающей точкой - использовать функцию float(). Если функция не вызывает ValueError, значит строка представляет число с плавающей точкой.

pythonCopy# Проверка, представляет ли строка число с плавающей точкой в Python

def is_float(a_string):
    try:
        float(a_string)
        return True
    except ValueError:
        return False

print(is_float('2.2.2'))
print(is_float('2.123'))

# Возвращает:
# False
# True

Когда строка с неправильным форматом числа с плавающей запятой передается, возвращается False. Если строка действительно представляет собой число с плавающей запятой, возвращается True.

Проверка отрицательных чисел

Все описанные выше методы не работают с отрицательными числами, так как знак минус (-) всегда будет возвращать False. Поэтому лучший способ проверки - удалить символ минуса, если он является первым символом.

pythonCopy# Функция для проверки цифровой строки с отрицательным числом
def is_negative_digit(a_string):
    if a_string[0] == '-':
        return a_string[1:].isdigit()

print(is_negative_digit('-123.3'))
print(is_negative_digit('-123'))

# Возвращает:
# False
# True

Мы видим, что функция работает как ожидается, сначала удаляя первый символ, если он равен -.

Заключение

В этой статье вы научились использовать строковые методы Python isdigit, isnumeric и isdecimal для проверки того, представляет ли строка различные числовые типы. Вы узнали тонкие различия между тремя методами, что дает вам четкое понимание, когда использовать каждый из методов (и, что не менее важно, когда не использовать). Вы также научились работать со строками, представляющими числа с плавающей точкой, и строками, представляющими отрицательные числа.

Чтобы узнать больше о методе Python isdigit, ознакомьтесь с официальной документацией здесь. Официальная документация для метода isnumeric доступна здесь, а документация для метода isdecimal доступна здесь

Last updated