Python 3 documentation for isdigit
说
如果字符串中的所有字符都是数字且at处于,则返回true 至少一个字符,否则为假。 数字包括小数 字符和需要特殊处理的数字,例如 兼容性上标数字。形式上,数字是一个字符 具有属性值Numeric_Type = Digit或 Numeric_Type =十进制。
所以听起来isdigit
应该是isdecimal
的超集。但后来docs for isdecimal
说
如果字符串中的所有字符都是十进制字符,则返回true 至少有一个角色,否则为假。十进制字符 是来自一般类别“Nd”的那些。 此类别包括数字 字符,以及可用于形成十进制基数的所有字符 数字,例如U + 0660,ARABIC-INDIC DIGIT ZERO。
听起来isdecimal
应该是isdigit
的超集。
这些方法有何关联?他们中的一个是否匹配另一个匹配的严格超集? Numeric_Type属性是否与Nd类别有关? (这个矛盾的文档是文档错误吗?)
答案 0 :(得分:5)
当我found out时,检查数值的字符串谓词与Unicode字符属性之间的对应关系如下:
isdecimal: Nd,
isdigit: No, Nd,
isnumeric: No, Nd, Nl,
isalnum: No, Nd, Nl, Lu, Lt, Lo, Lm, Ll,
例如,R(RUNIC BELGTHOR SYMBOL,U + 16F0)属于Nl
,因此:
'ᛰ'.isdecimal() # False
'ᛰ'.isdigit() # False
'ᛰ'.isnumeric() # True
'ᛰ'.isalnum() # True
答案 1 :(得分:3)
我阅读Unicode 6.0 standard第4.6节的方式,数字类别是十进制数字类别的超集。
通常理解的十进制数字是用于形成十进制数字的数字。它们包括特定于脚本的数字,但不包括罗马数字和希腊语的数字,这些数字不构成十进制基数表达式。 (注意,< 1,5> = 15 = 15,但是= IV = 4。)
Numeric_Type = decimal属性值(与General_Category = Nd属性值相关)仅限于十进制数字中使用的数字字符,并且已在连续范围内编码了一组完整的数字,按Numeric_Value的升序排列,数字零作为范围内的第一个代码点。
因此,小数类别将排除数字类型,如罗马数字,分数等。
答案 2 :(得分:1)
str.isdecimal的Python 3文档似乎已被更正,因此它不再表示小数包括数字:
str.isdecimal
如果字符串中的所有字符都是十进制字符且至少有一个字符,则返回true,否则返回false。十进制字符是那些可用于在基数10中形成数字的字符,例如, U + 0660,ARABIC-INDIC DIGIT ZERO。正则小数字符是Unicode常规类别“Nd”中的字符。
Python 2文档似乎仍然是错误的(与2.7.14实现不匹配)并始终声明小数包括数字:
str.isdigit
如果字符串中的所有字符都是数字且至少有一个字符,则返回true,否则返回false。 对于8位字符串,此方法取决于区域设置。
unicode.isdecimal
如果S中只有十进制字符,则返回True,否则返回False。 十进制字符包括数字字符,以及可用于形成十进制数字的所有字符,例如U + 0660,ARABIC-INDIC DIGIT ZERO。
对Python 2.7.14中字符“³”的快速测试表明,小数不包含数字:
>>> u'\u00b3'.isdecimal()
False
>>> u'\u00b3'.isdigit()
True
Python 2和3现在具有与Python 3文档相匹配的类似行为(数字包括小数),而Python 2文档则错误。