Как преобразовать числа Unicode в ints?

На арабском и китайском языках есть свои глифы для цифр. 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: '五' 

Я делаю что-то неправильно? Или это требование просто неверно ( источник ).

int не принимает все способы записи чисел. Он понимает цифровые символы, используемые для позиционных числовых систем, но ни Руми, ни китайские цифры не являются позиционными. Ни '五五' ни две копии номера Rumi 5 не представляют 55, поэтому int не принимает их.

Вот способ преобразования в числовые значения (приведение в 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 

EDIT: как отметил 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 отличное объяснение, но все же хотел предоставить решение, которое пытается охватить все случаи)

Источник неверен.

Из документа python:

класс int (x, base = 10)

Возвращает целочисленный объект, построенный из числа или строки x, или возвращает 0, если аргументы не заданы. Если x – число, верните x .__ int __ (). Для чисел с плавающей запятой это обрезается до нуля.

Если x не является числом или задано базовое значение, то x должен быть строкой, байтами или экземпляром bytearray, представляющим целочисленный литерал в базе оснований .

И целочисленный литерал – это всего лишь строка чисел.

Изменить: Неправильно, вырыто в исходный код и обнаружил, что эта функция вызывается, когда python хочет преобразовать строку в int. Существует py_CHARMASK, который, как я думаю, содержит необходимую нам информацию, но я не мог найти ее: /