У строки в Python есть два очень похожих метода. На столько похожих что кажется они делают одно и тоже.
Это метод isdigit() и isnumeric()
Давайте посмотрим зачем нам два одинаковых метода? И так ли они одинаковы?
Очевидно что isdigit() говорит нам, состоит ли строка только из чисел 0-9
>>> '12'.isdigit()
True
>>> '12x'.isdigit()
False
>>> '-12'.isdigit()
False
>>> '12.5'.isdigit()
False
Можно предположить что isnumeric() делает более глубокий анализ и распознаёт в строке float или отрицательное число.
>>> '15'.isnumeric()
True
>>> '-15'.isnumeric()
False
>>> '15.2'.isnumeric()
False
Нет, всё так же как и с другим методом. В чем же тогда разница? Для начала посмотрим следующие примеры:
>>> '5'.isdigit(), '5'.isnumeric() # Обычная цифра 5
# True, True
>>> '꧕'.isdigit(), '꧕'.isnumeric() # Яванская 5
# True, True
>>> '෩'.isdigit(), '෩'.isnumeric() # Синхала 3
# True, True
>>> '৩'.isdigit(), '৩'.isnumeric() # Бенгальская 3
# True, True
>>> '༣'.isdigit(), '༣'.isnumeric() # Тибетская 3
# True, True
>>> '³'.isdigit(), '³'.isnumeric() # 3 верхний индекс (степень)
# True, True
>>> '𝟝'.isdigit(), '𝟝'.isnumeric() # Математическая двойная 5
# True, True
>>> '๔'.isdigit(), '๔'.isnumeric() # Тайская 4
# True, True
>>> '➑'.isdigit(), '➑'.isnumeric() # 8 в круге
# True, True
А теперь примеры в которых, по мнению Python, результаты не равны
>>> '¾'.isdigit(), '¾'.isnumeric() # дробь три четверти
# False, True
>>> '⅕'.isdigit(), '⅕'.isnumeric() # дробь одна пятая
# False, True
>>> '𒐶'.isdigit(), '𒐶'.isnumeric() # клинопись 3
# False, True
>>> '三'.isdigit(), '三'.isnumeric() # 3 из унифицированной идеограммы
# False, True
>>> '⑩'.isdigit(), '⑩'.isnumeric() # цифра 10 в круге
# False, True
>>> 'Ⅳ'.isdigit(), 'Ⅳ'.isnumeric() # Римская 4
# False, True
>>> '𑇪'.isdigit(), '𑇪'.isnumeric() # Сенегальская архаическая 10
# False, True
>>> '𐌢'.isdigit(), '𐌢'.isnumeric() # Этрусская цифра 10
# False, True
>>> 'ↂ'.isdigit(), 'ↂ'.isnumeric() # Римская цифра 10000
# False, True
>>> '〇'.isdigit(), '〇'.isnumeric() # Символ ККЯ ноль
# False, True
Получается, что isdigit() говорит нам, является ли символ десятичной цифрой или спецсимволом, имеющим цифирное значение после преобразования.
В свою очередь isnumeric() включает все дополнительные символы юникода которые имеют отношения к числовым и цифровым представлениям.
Ну и пара примеров в которых в обоих случаях символ не является числом, это эмодзи.
>>> '🕙'.isdigit(), '🕙'.isnumeric() # эмодзи 10 часов
# False, False
>>> '7️⃣'.isdigit(), '7️⃣'.isnumeric() # эмодзи 7
# False, False
Также есть еще один дополнительный и весьма полезный метод isdecimal().
Он нам сообщает, можно ли из указанного символа сделать простую десятичную цифру. То есть сработает ли метод int(x)
>>> '෩'.isdecimal(), int('෩') # Синхала 3
# True, 3
>>> '➑'.isdecimal(), int('➑') # 8 в круге
# False, ValueError
Какие выводы?
🔸 При определении цифры в строке isdigit() подходит лучше чем isnumeric(), но оба не гарантируют успешную конвертацию в int
🔸 Для однозначного определения возможности преобразования строки в int лучше подходит метод isdecimal()
🔸 Для однозначного определения символов 0...9 лучше использовать regex
Полный список символов юникода которые определяются как numeric
#basic
#Italia#Sicilia
L’ex sottosegretario Laura #Castelli (#SCN|Populisti regionalisti) ha annunciato la candidatura a sindaco di Milazzo.
@OsservatorioItaliano
#Italia🇮🇹
#Regionali
#Marche
❗️Francesco #Acquaroli (#FdI|ECR; supportato anche da #LSP|Pfe, #FI|PPE, #UDC|PPE, #NM|PPE, #ScN|Meridionalisti, dissidenti di #IV|RE e civici) è stato rieletto Presidente della Giunta regionale delle Marche.
@TuttoElezioni
#Italia#Sicilia
I deputati di #SCN|Populisti regionalisti, Cateno #DeLuca, Giuseppe #Lombardo e Matteo #Sciotto hanno firmato le loro dimissioni dall’ARS. Il loro obiettivo è quello di raccogliere, entro il 31 luglio, 36 sottoscrizioni determinando così la chiusura anticipata della legislatura e andare al voto nel mese di ottobre.
“Siamo in una fase in Sicilia dove ci troviamo nel bel mezzo del vannamarchismo, dove impera chi si sa vendere meglio”, ha detto il sindaco di Taormina.
@OsservatorioItaliano
#Italia🇮🇹
#Regionali
#Calabria
❗️Roberto #Occhiuto (#FI|PPE; supportato anche da #FdI|ECR, #LSP|PfE, #DC|Centro, #UdC|PPE, #NM|PPE, #ScN|Meridionalisti, #PA|Animalisti) è stato rieletto Presidente della Giunta regionale della Calabria.
@TuttoElezioni
#Italia🇮🇹
#Regionali
#Puglia
Proiezione di Opinio Italia.
Emittente: RaiNews24.
Campione: 5%.
🟧 Antonio #Decaro (#PD|S&D; sostenuto anche da #M5S|LEFT, #AVS|G/EFA|LEFT, #PiùEu|RE, #IV|RE, #Az|RE, #PSI|S&D, #DemoS|S&D, #PRC|LEFT, liste minori e civici): 69,2%
🟦 Luigi #Lobuono (#FdI|ECR, #FI|PPE, #LSP|PfE, #UdC|PPE, #NPSI|Centro-destra, #ScN|Meridionalisti, #PdF|Destra cristiana, #DC|Centro, liste minori e civici): 28,8%
@TuttoElezioni