简短回答:
如果一个字符代表一个十进制数字,那么像1
, ¹
(上标一),①
(带圆圈的数字一),١
(阿拉伯语-印度语数字一),unicodedata.digit
将返回字符表示为 int 的数字(因此所有这些示例均为 1)。
如果字符代表任何数值,那么像⅐
(粗俗分数七分之一)和所有十进制数字示例,unicodedata.numeric
将以浮点形式给出该字符的数值。
由于技术原因,更新的数字字符如????
(DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO) 可能会引发 ValueErrorunicodedata.digit
.
长答案:
Unicode 字符都有一个Numeric_Type
财产。此属性可以有 4 个可能的值:Numeric_Type=Decimal、Numeric_Type=Digit、Numeric_Type=Numeric 或 Numeric_Type=None。
引用Unicode 标准,版本 10.0.0,第 4.6 节,
Numeric_Type=Decimal 属性值(与 General_Category=Nd 相关)
属性值)仅限于十进制基数中使用的数字字符
数字,并且完整的数字集已在连续范围内编码,
以 Numeric_Value 的升序排列,并以数字零作为第一个代码点
范围。
Numeric_Type=十进制字符因此是符合一些其他特定技术要求的十进制数字。
十进制数字,如 Unicode 标准中这些属性分配所定义,不包括
一些字符,例如CJK表意数字(见表4-5中的前十个条目),
它们不是以连续序列编码的。小数位也排除了兼容性
下标和上标数字,以防止简单的解析器误解
他们的价值观。 (有关上标和下标的更多信息,请参见
第 22.4 节,上标和下标符号。)传统上,Unicode 字符
数据库已为这些不连续或兼容数字集赋予值 Numeric_Type=Digit,以识别它们由数字值组成但不一定包含数字值的事实
满足 Numeric_Type=Decimal 的所有条件。然而,两者之间的区别
Numeric_Type=Digit 和更通用的 Numeric_Type=Numeric 已被证明不是
在实现中很有用。因此,未来可能会添加到标准中的数字集
并且不满足 Numeric_Type=Decimal 标准的将只是
分配值 Numeric_Type=Numeric。
因此,Numeric_Type=Digit 历史上用于不符合 Numeric_Type=Decimal 技术要求的其他数字,但他们认为这没有用,并且自 Unicode 6.3 起,不满足 Numeric_Type=Decimal 要求的数字字符刚刚被分配为 Numeric_Type=Numeric。 0。例如,????
Unicode 7.0 中引入的 (DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO) 具有 Numeric_Type=Numeric。
Numeric_Type=Numeric 适用于表示数字且不适合其他类别的所有字符,Numeric_Type=None 适用于不表示数字的字符(或者至少在正常使用情况下不表示数字)。
所有具有非 None Numeric_Type 属性的字符都具有表示其数值的 Numeric_Value 属性。unicodedata.digit
对于 Numeric_Type=Decimal 或 Numeric_Type=Digit 的字符,将返回该值作为 int,并且unicodedata.numeric
对于具有任何非 None Numeric_Type 的字符,将返回该值作为浮点数。