isdecimal和isdigit之间的区别

时间:2014-03-10 10:39:02

标签: python unicode

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类别有关? (这个矛盾的文档是文档错误吗?)

3 个答案:

答案 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)

Python 3

str.isdecimal的Python 3文档似乎已被更正,因此它不再表示小数包括数字:

str.isdecimal

  

如果字符串中的所有字符都是十进制字符且至少有一个字符,则返回true,否则返回false。十进制字符是那些可用于在基数10中形成数字的字符,例如, U + 0660,ARABIC-INDIC DIGIT ZERO。正则小数字符是Unicode常规类别“Nd”中的字符。

Python 2

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文档则错误。