如何在 python 中将带有数字的异常 unicode 字符串转换为整数

How to convert unusual unicode string with number to integer in python

我有一些相当复杂的 unicode 字符串,其中包含数字,我想测试它们的值。通常,我只是使用 str.isnumeric 来测试它是否可以通过 int() 转换,但我遇到 isnumeric returns True 但是 int() 引发异常。

这是一个示例程序:

>>> s = '⒍'
>>> s.isnumeric()
True
>>> int(s)
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '⒍' 

Unicode 总是充满惊喜,所以我很高兴能够对这种情况保持稳健,并使用 try/except 块来捕获异常数字。但是,如果我仍然可以将它们转换为整数,我会更高兴。有没有一致的方法来做到这一点?

如果要测试字符串是否可以传递给 int,请使用 str.isdecimalstr.isnumericstr.isdigit 都包含与 int.

不兼容的类似小数的字符

正如@abarnert 在评论中提到的,测试字符串是否可以传递给 int 的最有保证的方法是简单地在 try 块中进行。

另一方面,'⒍'可以在unicodedata模块的帮助下转换为实际数字,例如

print(unicodedata.digit('⒍'))

会输出 6.

我不知道你会有多少运气,但 unicodedata 可能会处理一些情况(python 3 代码):

>>> import unicodedata
>>> unicodedata.normalize('NFKC', '⒍')
'6.'

稍微好一点。至于测试,如果你想要一个 int 你可以 int() 它并捕获异常。

找出一个字符串是否可以转换为 int 的最佳方法是 try 它:

s = '⒍'
try:
    num = int(s)
except ValueError:
    # handle it

当然,您可以尝试找出正确的方法来提前测试字符串,但为什么呢?如果您想要的规则是 "whatever int accepts",只需使用 int.


如果要转换数字而非小数,请使用 unicodedata 模块:

s = '⒍'
num = unicodedata.digit(s) # 6
num = unicodedata.numeric(s) # 6.0
num = unicodedata.decimal(s) # ValueError: not a decimal

DIGIT SIX FULL STOP 字符在数据库中的条目具有数字和数字值,尽管是 Number, Other 而不是 Number, Decimal Digit(因此与 int 不兼容) ).