Нюансы 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.






Программирование на python
1K постов12K подписчик
Правила сообщества
Публиковать могут пользователи с любым рейтингом. Однако!
Приветствуется:
• уважение к читателям и авторам
• конструктивность комментариев
• простота и информативность повествования
• тег python2 или python3, если актуально
• код публиковать в виде цитаты, либо ссылкой на специализированный сайт
Не рекомендуется:
• допускать оскорбления и провокации
• распространять вредоносное ПО
• просить решить вашу полноценную задачу за вас
• нарушать правила Пикабу