38

Нюансы Python #1: isdecimal и его друзья

Помните задачу «Мы уже приехали»? Для её решения некоторые пикабушники применяли строковые методы isdigit() и isnumeric(), чтобы узнать, содержит ли строка только цифровые символы.

Но насколько это правильно, и в чём отличие между isnumeric(), isdigit() и isdecimal()? Сейчас разберёмся.

Далее в посте будет много примеров кода в виде скриншотов. Забрать код в удобном текстовом формате или просто выполнить его онлайн можно здесь.


isnumeric()

Начнём с самого «широкого» метода, который охватывает больше всего возможных вариантов: isnumeric().


Смотрим в документацию: возвращает True, если все символы в строке являются числовыми и при этом в ней есть как минимум 1 символ. В противном случае возвращает False. Числовые символы включают в себя все символы, которые в таблице Unicode относятся к числовым, в том числе символы вроде ⅕.


Выполните вот этот код:

unicode_numerics = ['⅕', '零', '²']
for num in unicode_numerics:
# Тут редактор Пикабу сжирает отступ, его нужно добавить вручную
print(num.isnumeric())

Вы увидите, что в каждом из 3 случаев получен результат True. Но вполне очевидно, что привести эти числа к int не получится:

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

isdigit()

Этот метод охватывает уже меньше вариантов, чем isnumeric(). Снова обращаемся к документации: возвращает True, если все символы в строке являются «цифрами» и при этом в ней есть как минимум 1 символ. В противном случае возвращает False. «Цифры» включают в себя десятичные символы, а также «специальные цифры», которые требуют особой обработки, например, ² или 𐩀.


Пробуем привести эти символы к int:

То есть isdigit() тоже не стоит использовать для того, чтобы проверить, хранится ли в строке привычное десятичное число.

isdecimal()

А вот теперь смотрим документацию к методу isdecimal(): возвращает True, если все символы в строке являются десятичными символами и при этом в ней есть как минимум 1 символ. В противном случае возвращает False. Десятичные символы - это те, из которых можно собрать число в десятичной системе счисления.

И вот этот метод уже можно использовать, чтобы понять, хранятся ли в строке только цифры или нет.


При этом важно учитывать, что символы "." и "-" не являются цифрами:

Таким образом, с помощью isdecimal() можно узнать, находится ли в строке целое неотрицательное число, то есть просто набор десятичных цифр без знаков и точек/запятых.

try / except

А как быть, если вы хотите проверить, содержит ли строка вообще любое десятичное число, а не только целое неотрицательное?


Для этого просто приведите его к float.

Правила сообщества

Публиковать могут пользователи с любым рейтингом. Однако!


Приветствуется:

• уважение к читателям и авторам

• конструктивность комментариев

• простота и информативность повествования

• тег python2 или python3, если актуально

• код публиковать в виде цитаты, либо ссылкой на специализированный сайт


Не рекомендуется:

• допускать оскорбления и провокации

• распространять вредоносное ПО

• просить решить вашу полноценную задачу за вас

• нарушать правила Пикабу

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества