isdecimal和isdigit之间的区别

use*_*ica 9 python unicode

用于isdigit说明的Python 3 文档

如果字符串中的所有字符都是数字并且至少有一个字符,则返回true,否则返回false.数字包括十进制字符和需要特殊处理的数字,例如兼容性上标数字.形式上,数字是具有属性值Numeric_Type = Digit或Numeric_Type = Decimal的字符.

所以听起来isdigit应该是超集isdecimal.但随后文档isdecimal

如果字符串中的所有字符都是十进制字符并且至少有一个字符,则返回true,否则返回false.十进制字符是来自一般类别"Nd"的字符.此类别包括数字字符,以及可用于形成十进制数字的所有字符,例如U + 0660,ARABIC-INDIC DIGIT ZERO.

这听起来isdecimal应该是一个超集isdigit.

这些方法有何关联?他们中的一个是否匹配另一个匹配的严格超集?Numeric_Type属性是否与Nd类别有关?(这个矛盾的文档是文档错误吗?)

Mir*_*lov 5

发现,检查数值的字符串谓词和Unicode字符属性之间的对应关系如下:

isdecimal: Nd,
isdigit:   No, Nd,
isnumeric: No, Nd, Nl,
isalnum:   No, Nd, Nl, Lu, Lt, Lo, Lm, Ll,
Run Code Online (Sandbox Code Playgroud)

例如,ᛰ(RUNIC BELGTHOR SYMBOL,U + 16F0)属于Nl,因此:

'?'.isdecimal() # False
'?'.isdigit()   # False
'?'.isnumeric() # True
'?'.isalnum()   # True
Run Code Online (Sandbox Code Playgroud)


tri*_*eee 3

按照我阅读Unicode 6.0 标准第 4.6 节的方式,数字类别是十进制数字类别的超集。

正如通常所理解的,十进制数字是用于形成十进制基数的数字。它们包括特定于脚本的数字,但不包括罗马数字和希腊缩写数字等字符,这些字符不形成十进制基数表达式。(请注意,<1, 5> = 15 = 十五,但 = IV = 四。)

Numeric_Type=decimal 属性值(与 General_Category=Nd 属性值相关)仅限于十进制基数中使用的数字字符,并且已在连续范围内对完整数字集进行编码,并按升序排列Numeric_Value 的顺序,并将数字零作为范围中的第一个代码点。

因此,小数类别将排除数字类型,例如罗马数字、分数等。