Isdecimal: примеры (PYTHON)
isdecimal: boolОсновы метода isdecimal
Метод str.isdecimal() проверяет, состоит ли строка только из десятичных цифровых символов. Это метод строковых объектов (str), который не принимает аргументов и возвращает логическое значение (bool).
Основное применение - валидация пользовательского ввода, когда требуется убедиться, что строка представляет собой целое неотрицательное число в десятичной системе счисления без знаков, пробелов или других символов.
Метод возвращает True, если в строке есть хотя бы один символ и все символы строки являются десятичными цифрами в Unicode. В противном случае возвращается False. Пустая строка также дает False.
Важное уточнение: десятичные цифры в Unicode - это символы, которые используются для записи чисел в десятичной системе, такие как арабские цифры 0-9, а также цифры из других письменностей (например, индийские), но не включают римские цифры, дроби, надстрочные/подстрочные цифры или цифры, составленные из нескольких символов.
Простые примеры использования
Базовые случаи работы метода с разными типами строк.
# Пример 1: Обычные арабские цифры
print('123'.isdecimal())
print('0'.isdecimal())True True
# Пример 2: Строка с нецифровыми символами
print('12.3'.isdecimal())
print('-5'.isdecimal())
print('1 234'.isdecimal())False False False
# Пример 3: Пустая строка и символы из других категорий
print(''.isdecimal())
print('①'.isdecimal()) # Кружковая цифра
print('½'.isdecimal()) # ДробьFalse False False
# Пример 4: Цифры на других языках (например, арабские индийские)
print('\u0661\u0662\u0663'.isdecimal()) # Арабские индийские цифры ١٢٣True
Похожие строковые методы в Python
str.isdigit(): Возвращает True, если все символы в строке являются цифрами, и в строке есть хотя бы один символ. Понятие "цифра" шире, чем у isdecimal(), и включает надстрочные/подстрочные цифры (например, '²') и цифры, составленные из нескольких символов (например, кружковые цифры '①').
str.isnumeric(): Возвращает True, если все символы в строке являются числовыми, и в строке есть хотя бы один символ. Это самое широкое понятие, включающее цифры, дроби (например, '½'), римские цифры, числительные из иероглифических языков.
Правило вложенности: Все строки, для которых isdecimal() возвращает True, также вернут True для isdigit() и isnumeric(). Все строки, валидные для isdigit(), также валидны для isnumeric(), но обратное не всегда верно.
Выбор метода: Для проверки, можно ли строку безопасно преобразовать в целое число с помощью int(), подходит isdecimal(). isdigit() полезен для проверки цифр в более широком смысле, например, в математических текстах. isnumeric() используется для проверки любых числовых символов в Unicode.
Частые ошибки и недоразумения
1. Ожидание True для пустой строки: Метод возвращает False для пустой строки, что иногда становится неожиданностью.
print(''.isdecimal())False
2. Проверка чисел с плавающей точкой или отрицательных: Метод не распознает точку, минус или пробелы как десятичные цифры.
print('-5'.isdecimal()) # Ожидают True для отрицательного числа
print('12.5'.isdecimal()) # Ожидают True для floatFalse False
3. Вызов метода на нестроковых объектах: Метод существует только у строк. Попытка вызова на числе вызовет ошибку.
# num = 123
# num.isdecimal() # AttributeError: 'int' object has no attribute 'isdecimal'4. Путаница с isdigit и isnumeric: Использование isdecimal() для символов, которые являются цифрами, но не десятичными (например, римских цифр).
print('Ⅳ'.isdecimal()) # Римская цифра 4
print('⁵'.isdecimal()) # Надстрочная цифра 5False False
История изменений
Метод str.isdecimal() был добавлен в Python 2.6 и 3.0 как часть улучшенной поддержки Unicode. В Python 3 поведение метода было четко определено в соответствии со стандартом Unicode.
Важное изменение произошло с приходом Python 3, где все строки по умолчанию являются Unicode. В Python 2 аналогичный метод мог работать по-разному с обычными строками (bytes) и Unicode-строками.
Начиная с Python 3.0, метод стабилен и его поведение не менялось в последующих версиях. Документация уточняет, что символ считается десятичной цифрой, если его категория Unicode - 'Nd' (Number, Decimal Digit).
Расширенные примеры применения
Пример 1: Валидация пользовательского ввода для целочисленного поля.
def validate_integer_input(user_input):
if user_input.isdecimal():
number = int(user_input)
return f'Введено корректное число: {number}'
else:
return 'Ошибка: ввод должен содержать только цифры 0-9 без пробелов и знаков.'
print(validate_integer_input('10025'))
print(validate_integer_input('1,000'))
print(validate_integer_input(''))Введено корректное число: 10025 Ошибка: ввод должен содержать только цифры 0-9 без пробелов и знаков. Ошибка: ввод должен содержать только цифры 0-9 без пробелов и знаков.
Пример 2: Фильтрация десятичных цифр из смешанной строки.
text = "Счет №12345 от 01.02.2023, сумма 1000₽"
decimal_parts = [char for char in text if char.isdecimal()]
print(''.join(decimal_parts))
# Фильтрует только символы категории Nd123450120231000
Пример 3: Сравнение поведения isdecimal, isdigit и isnumeric на специфичных символах.
test_chars = ['5', '٥', 'Ⅴ', '⁵', '½', '五']
for char in test_chars:
print(f"'{char}': isdecimal={char.isdecimal()}, "
f"isdigit={char.isdigit()}, isnumeric={char.isnumeric()}")'5': isdecimal=True, isdigit=True, isnumeric=True '٥': isdecimal=True, isdigit=True, isnumeric=True 'Ⅴ': isdecimal=False, isdigit=False, isnumeric=True '⁵': isdecimal=False, isdigit=True, isnumeric=True '½': isdecimal=False, isdigit=False, isnumeric=True '五': isdecimal=False, isdigit=False, isnumeric=True
Пример 4: Использование с числами, записанными цифрами других письменностей.
# Бенгальские цифры
bengali_num = '১২৩' # 123
print(f"{bengali_num}: isdecimal = {bengali_num.isdecimal()}")
# Преобразование в int после проверки
if bengali_num.isdecimal():
print(int(bengali_num)) # Это вызовет ошибку, int не распознает эти цифры
# Для преобразования требуется явное указание системы счисления или конвертация১২৩: isdecimal = True ValueError: invalid literal for int() with base 10: '১২৩'
Пример 5: Проверка номеров, которые могут содержать ведущие нули.
def is_valid_id(code):
return code.isdecimal() and len(code) == 8
print(is_valid_id('00123456'))
print(is_valid_id('A1234567'))True False
Аналоги функции в других языках
PHP: Функция ctype_digit($text) проверяет, все ли символы в строке являются цифровыми. Аналог isdecimal(), но работает только с ASCII цифрами 0-9.
// PHP
var_dump(ctype_digit('123')); // true
var_dump(ctype_digit('12.3')); // falsebool(true) bool(false)
JavaScript: Регулярные выражения или метод Number.isInteger() после приведения. Прямого аналога нет.
// JavaScript
/^\d+$/.test('123'); // true
/^\d+$/.test('12.3'); // falsetrue false
Java: Метод String.matches("\\d+") или Character.isDigit() для каждого символа. Проверяет цифры в широком смысле, как isdigit().
// Java
"123".matches("\\d+"); // true
"①".matches("\\d+"); // false, в отличие от isdigit Pythontrue false
C#: Метод char.IsDigit() для каждого символа или int.TryParse(). Аналогичен поведению isdigit() в Python.
SQL: Обычно используют регулярные выражения или функции типа ISNUMERIC() (SQL Server), но их поведение может отличаться.
Основное отличие Python - встроенная поддержка Unicode и четкое разделение между isdecimal, isdigit и isnumeric.