'\u00BD' # ½
'\u00B2' # ²
Я пытаюсь понять isdecimal() и isdigit() лучше, для этого необходимо понять свойства числовых значений unicode. Как я могу увидеть свойство числового значения, например, указанных выше двух юникодов.
'\u00BD' # ½
'\u00B2' # ²
Я пытаюсь понять isdecimal() и isdigit() лучше, для этого необходимо понять свойства числовых значений unicode. Как я могу увидеть свойство числового значения, например, указанных выше двух юникодов.
Чтобы получить "числовое значение", содержащееся в символе, вы можете использовать unicodedata.numeric()
function:
>>> import unicodedata
>>> unicodedata.numeric('\u00BD')
0.5
Используйте ord()
функцию, чтобы получить целочисленный код, необязательно в сочетании с format()
, чтобы создать шестнадцатеричное значение:
>>> ord('\u00BD')
189
>>> format(ord('\u00BD'), '04x')
'00bd'
Вы можете получить доступ к свойству символа с помощью unicodedata.category()
, который вам нужно будет проверить против документированных категорий:
>>> unicodedata('\u00DB')
'No'
где 'No'
обозначает Number, Other.
Однако в категории Lo
есть серия .isnumeric() == True
символов; база данных Python unicodedata
дает вам доступ к общей категории и использует методы str.isdigit()
, str.isnumeric()
и unicodedata.digit()
, unicodedata.numeric()
и т.д. для обработки дополнительных категорий.
Если вам нужен точный список всех числовых символов Unicode, канонический источник - это Unicode database; ряд текстовых файлов, которые определяют весь стандарт. Файл DerivedNumericTypes.txt
(v. 6.3.0) дает вам "представление" в этой базе данных, в котором указаны числовые свойства; он говорит вам наверху, как файл получается из других файлов данных в стандарте. То же самое для DerivedNumericValues.txt
file, в котором перечислены точные числовые значения для кодового пункта.
в документах явно указывается связь между методами и свойством Numeric_Type
.
def is_decimal(c):
"""Whether input character is Numeric_Type=decimal."""
return c.isdecimal() # it means General Category=Decimal Number in Python
def is_digit(c):
"""Whether input character is Numeric_Type=digit."""
return c.isdigit() and not c.isdecimal()
def is_numeric(c):
"""Whether input character is Numeric_Type=numeric."""
return c.isnumeric() and not c.isdigit() and not c.isdecimal()
Пример:
>>> for c in '\u00BD\u00B2':
... print("{}: Numeric: {}, Digit: {}, Decimal: {}".format(
... c, is_numeric(c), is_digit(c), is_decimal(c)))
...
½: Numeric: True, Digit: False, Decimal: False
²: Numeric: False, Digit: True, Decimal: False
Я не уверен Десятичное число и Numeric_Type = Decimal всегда будет идентичным.
Примечание: '\u00B2'
не является десятичным, потому что суперскрипты явно исключены стандартом, см. 4.6 Численное значение (Unicode 6.2).