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

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

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

* Что делают методы `.isdigit()`, `.isnumeric()` и `.isdecimal()`, каковы их ограничения и области применения
* Различия между тремя методами и случаи, когда они могут работать не совсем так, как ожидается

#### Оглавление:

* [Python `isdigit`: Как работает](#python-isdigit-kak-rabotaet)
* [Python `isnumeric`: Как работает](#python-isnumeric-kak-rabotaet)
* [Python `isdecimal`: Как работает](#python-isdecimal-kak-rabotaet)
* [Различия между Python `isdigit`, `isnumeric`, `isdecimal`](#razlichiya-mezhdu-python-isdigit-isnumeric-isdecimal)
* [Проверка числа с плавающей точкой ](#proverka-chisla-s-plavayushei-tochkoi)
* [Проверка отрицательных чисел ](#proverka-otricatelnykh-chisel)
* [Заключение](#zaklyuchenie)

### **Python `isdigit`: Как работает**

&#x20;Метод `isdigit()` возвращает <mark style="color:blue;">**True**</mark>, если все символы в строке являются цифрами, и <mark style="color:blue;">**False**</mark> в противном случае.

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

```python
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()` имеет некоторые особенности:

* Если все символы являются цифрами, метод возвращает <mark style="color:blue;">**True**</mark>
* Если символ - пробел или десятичная точка, метод возвращает <mark style="color:blue;">**False**</mark>

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

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

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

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

### **Python isnumeric: Как работает**&#x20;

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

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

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

```python
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: Как работает**

&#x20;Метод `isdecimal()` несколько отличается, посколько оценивает, является ли символ десятичным символом, а не числовым символом. Из-за этого он вернет <mark style="color:blue;">**True**</mark>, только если все символы могут быть представлены десятичным числом, то есть дроби и надстрочные символы будут возвращать <mark style="color:blue;">**False**</mark>.

```python
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`, которые могут использоваться для определения различий, связанных с числами в строках&#x20;

{% hint style="info" %}
<mark style="color:purple;">**Важно отметить, что:**</mark> проверка на истинность происходит в порядке `isdecimal`, `isdigit`, затем `isnumeric` – это означает, что всё, что истина для isdecimal, будет истино и для следующих двух. Всё, что истина для `isdigit`, будет истино для `isnumeric`
{% endhint %}

<table data-header-hidden><thead><tr><th></th><th width="128"></th><th></th><th></th><th></th></tr></thead><tbody><tr><td>Тип строки</td><td>Пример</td><td>Python <code>.isdecimal()</code></td><td>Python <code>.isdigit()</code></td><td>Python <code>.isnumeric()</code></td></tr><tr><td>Десятичные числа</td><td><code>'0123'</code></td><td>True</td><td>True</td><td>True</td></tr><tr><td>Дроби и верхние индексы</td><td><code>'⅔', '2²'</code></td><td>False</td><td>True</td><td>True</td></tr><tr><td>Римские цифры</td><td><code>'ↁ'</code></td><td>False</td><td>False</td><td>True</td></tr></tbody></table>

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

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

Самый простой способ проверить, представляет ли строка число с плавающей точкой - использовать функцию `float()`. Если функция не вызывает <mark style="color:orange;">**ValueError**</mark>, значит строка представляет число с плавающей точкой.

```python
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.`

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

Все описанные выше методы не работают с отрицательными числами, так как знак минус **`(-)`** всегда будет возвращать <mark style="color:blue;">**False**</mark>. Поэтому лучший способ проверки - удалить символ минуса, если он является первым символом.

```python
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
```

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

### **Заключение**&#x20;

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

Чтобы узнать больше о методе Python `isdigit`, ознакомьтесь с [официальной документацией здесь](https://docs.python.org/3/library/stdtypes.html?highlight=isdigit#str.isdigit). Официальная документация для метода `isnumeric` [доступна здесь](https://docs.python.org/3/library/stdtypes.html?highlight=isdigit#str.isnumeric), а документация для метода `isdecimal` [доступна здесь](https://docs.python.org/3/library/stdtypes.html?highlight=isdigit#str.isdecimal)
