Как выявить свойство числового значения Unicodes

'\u00BD' # ½
'\u00B2' # ²

Я пытаюсь понять isdecimal() и isdigit() лучше, для этого необходимо понять свойства числовых значений unicode. Как я могу увидеть свойство числового значения, например, указанных выше двух юникодов.

Ответ 1

Чтобы получить "числовое значение", содержащееся в символе, вы можете использовать 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, в котором перечислены точные числовые значения для кодового пункта.

Ответ 2

в документах явно указывается связь между методами и свойством 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).