Isdecimal: примеры (PYTHON)

Проверка десятичных цифр с помощью метода 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 для float
False
False

3. Вызов метода на нестроковых объектах: Метод существует только у строк. Попытка вызова на числе вызовет ошибку.

# num = 123
# num.isdecimal()  # AttributeError: 'int' object has no attribute 'isdecimal'

4. Путаница с isdigit и isnumeric: Использование isdecimal() для символов, которые являются цифрами, но не десятичными (например, римских цифр).

print('Ⅳ'.isdecimal())  # Римская цифра 4
print('⁵'.isdecimal())   # Надстрочная цифра 5
False
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: Валидация пользовательского ввода для целочисленного поля.

Пример python
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: Фильтрация десятичных цифр из смешанной строки.

Пример python
text = "Счет №12345 от 01.02.2023, сумма 1000₽"
decimal_parts = [char for char in text if char.isdecimal()]
print(''.join(decimal_parts))
# Фильтрует только символы категории Nd
123450120231000

Пример 3: Сравнение поведения isdecimal, isdigit и isnumeric на специфичных символах.

Пример python
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: Использование с числами, записанными цифрами других письменностей.

Пример python
# Бенгальские цифры
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: Проверка номеров, которые могут содержать ведущие нули.

Пример python
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')); // false
bool(true)
bool(false)

JavaScript: Регулярные выражения или метод Number.isInteger() после приведения. Прямого аналога нет.

// JavaScript
/^\d+$/.test('123'); // true
/^\d+$/.test('12.3'); // false
true
false

Java: Метод String.matches("\\d+") или Character.isDigit() для каждого символа. Проверяет цифры в широком смысле, как isdigit().

// Java
"123".matches("\\d+"); // true
"①".matches("\\d+"); // false, в отличие от isdigit Python
true
false

C#: Метод char.IsDigit() для каждого символа или int.TryParse(). Аналогичен поведению isdigit() в Python.

SQL: Обычно используют регулярные выражения или функции типа ISNUMERIC() (SQL Server), но их поведение может отличаться.

Основное отличие Python - встроенная поддержка Unicode и четкое разделение между isdecimal, isdigit и isnumeric.

питон isdecimal function comments

En
Isdecimal Check if all characters are decimals