如何将unicode数字转换为整数?

时间:2016-09-26 18:59:25

标签: python python-3.x unicode

  

阿拉伯语和中文有自己的数字字形。 int可以正确地使用所有不同的方式来编写数字。

我无法重现行为(python 3.5.0)

>>> from unicodedata import name
>>> name('')
'RUMI DIGIT FIVE'
>>> int('')
ValueError: invalid literal for int() with base 10: ''
>>> int('五')  # chinese/japanese number five
ValueError: invalid literal for int() with base 10: '五'

我做错了吗?或者说索赔是不正确的(source)。

3 个答案:

答案 0 :(得分:5)

这是一种转换为数值的方法(转换为int并不适用于所有情况,除非在某处有秘密设置)

from unicodedata import numeric
print(numeric('五'))

结果:5.0

有人注意到(并且是对的)一些阿拉伯语或其他字符与int一起正常工作,因此可以执行具有回退机制的例程:

from unicodedata import numeric

def to_integer(s):
    try:
        r = int(s)
    except ValueError:
        r = int(numeric(s))
    return r

编辑:正如zvone所指出的,有些分数字符会返回浮点数:ex:numeric('\u00be') is 0.75(3/4 char)。因此,舍入到int并不总是安全的。

EDIT2:numeric函数只接受一个字符。因此,“转换为数字”可以处理大多数没有舍入风险的情况

from unicodedata import numeric

def to_float(s):
    try:
        r = float(s)
    except ValueError:
        r = numeric(s)
    return r

print(to_float('۵۵'))
print(to_float('五'))
print(to_float('¾'))

结果:

55.0
5.0
0.75

(我不想窃取user2357112出色的解释,但仍想提供一个试图涵盖所有案例的解决方案)

答案 1 :(得分:5)

int不接受所有写数字的方法。它理解用于位置数字系统的数字字符,但RumiChinese数字都不是位置。 '五五'和Rumi数字5的两个副本都不代表55,因此int不接受它们。

答案 2 :(得分:-1)

来源不正确。

来自python doc:

  

class int(x,base = 10)

     

返回一个由a构造的整数对象   数字或字符串x,如果没有给出参数,则返回0。如果x是a   number,return x .__ int __()。对于浮点数,这会截断   零。

     

如果x不是数字或者给出了base,那么x必须是一个字符串,   bytes或bytearray实例表示基数中的整数文字   基即可。

整数文字只是一串数字。

编辑:错误,挖掘源代码并发现当python想要将字符串转换为int时调用this函数。有一个 py_CHARMASK 我猜包含我们需要的信息,但我找不到它:/