如何显示Unicodes数值属性

时间:2014-04-01 15:15:44

标签: python python-3.x unicode

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

我试图更好地理解isdecimal()和isdigit(),因为它必须理解unicode数值属性。我怎样才能看到例如上面两个unicodes的数值属性。

2 个答案:

答案 0 :(得分:5)

获取'数值'包含在角色中,您可以使用unicodedata.numeric() function

>>> import unicodedata
>>> unicodedata.numeric('\u00BD')
0.5

使用ord() function获取整数代码点,可选择与format()结合使用以生成十六进制值:

>>> ord('\u00BD')
189
>>> format(ord('\u00BD'), '04x')
'00bd'

您可以使用unicodedata.category()访问字符属性,然后您需要根据记录的类别进行检查:

>>> unicodedata('\u00DB')
'No'

其中'No' stands for Number, Other

但是,类别.isnumeric() == True中有一系列Lo个字符; Python unicodedata数据库只允许您访问常规类别,并依赖str.isdigit()str.isnumeric()unicodedata.digit()unicodedata.numeric()等方法来处理其他类别。

如果您需要所有数字Unicode字符的精确列表,则规范来源为Unicode database;一系列定义整个标准的文本文件。 DerivedNumericTypes.txt file (v. 6.3.0)为您提供了一个视图'在该数据库上具体的数字属性;它告诉您顶部文件是如何从标准中的其他数据文件派生的。同上DerivedNumericValues.txt file,列出每个代码点的确切数值。

答案 1 :(得分:1)

the docs明确指定方法与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

我不确定Decimal NumberNumeric_Type=Decimal是否完全相同。

注意:'\u00B2'不是十进制,因为标准明确排除了上标,请参阅4.6 Numerical Value (Unicode 6.2)