从unicodedata文档:
digit(chr[,默认值])返回分配给
字符chr为整数。如果未定义此类值,则默认为
返回,或者,如果未给定,则引发ValueError。
unicodedata.numeric(chr[,默认值])返回指定的数值
以浮动的形式发送给字符chr。如果未定义此类值,则默认为
返回,或者,如果未给定,则引发ValueError。
有谁能解释一下这两种功能的区别吗?
这里的人可以阅读the implementation of both functions,但我不清楚快速查看与此有什么不同,因为我不熟悉CPython实现。
编辑1:
这是一个很好的例子来说明两者的区别。
编辑2:
有助于补充@user2357112的评论和精彩答案的示例:
print(unicodedata.digit('1')) # Decimal digit one.
print(unicodedata.digit('١')) # ARABIC-INDIC digit one
print(unicodedata.digit('¼')) # Not a digit, so "ValueError: not a digit" will be generated.
print(unicodedata.numeric('Ⅱ')) # Roman number two.
print(unicodedata.numeric('¼')) # Fraction to represent one quarter.
最佳答案
简短回答:
如果一个字符代表一个十进制数字,那么像1
,¹
(上标1),①
(带圆圈的数字1),١
(阿拉伯-印度数字1),unicodedata.digit
将返回字符表示为int的数字(对于所有这些示例,都是so 1)。
如果字符代表任何数值,那么像⅐
(普通分数七分之一)和所有十进制数字示例,unicodedata.numeric
将以浮点形式给出该字符的数值。
出于技术原因,较新的数字字符如🄌
(丁贝符反白带圆圈的无衬线数字零)可能会从unicodedata.digit
引发值错误。
长答案:
Unicode字符都具有Numeric_Type
属性。此属性可以有4个可能的值:Numeric_Type=Decimal、Numeric_Type=Digit、Numeric_Type=Numeric或Numeric_Type=None。
引用Unicode standard, version 10.0.0, section 4.6,
Numeric_Type=Decimal属性值(与General_Category=Nd相关
属性值)仅限于十进制基数中使用的数字字符
一组完整的数字在一个连续的范围内被编码,
以数值的升序排列,并以数字0作为
范围。
Numeric_Type=Decimal字符因此是符合一些其他特定技术要求的十进制数字。
这些属性分配在Unicode标准中定义的十进制数字不包括
一些字符,如中日韩象形文字数字(见表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.0以来,不符合Numeric_Type=Decimal要求的数字字符刚刚被指定为Numeric_Type=Numeric。例如,Unicode 7.0中引入的🄌
(丁贝符反白带圆圈无衬线数字零)具有Numeric_Type=Numeric。
Numeric_Type=Numeric适用于表示数字且不适合其他类别的所有字符,Numeric_Type=None适用于不表示数字(或至少在正常使用情况下不表示数字)的字符。
具有非非非数值类型属性的所有字符都具有表示其数值的数值属性。unicodedata.digit
将该值作为int返回给Numeric_Type=Decimal或Numeric_Type=Digit的字符,unicodedata.numeric
将该值作为float返回给任何非Numeric_Type的字符。
关于python - unicodedata.digit和unicodedata.numeric有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45923675/