Как преобразовать необычную строку Unicode с числом в целое число в Python - PullRequest
0 голосов
/ 03 июля 2018

У меня есть несколько довольно волосатых юникодных строк с числами, в которых я хотел бы проверить значение. Обычно я бы просто использовал str.isnumeric, чтобы проверить, можно ли преобразовать его через int(), но я сталкиваюсь со случаями, когда isnumeric возвращает 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: '⒍' 

Юникод всегда полон сюрпризов, так что я рад, что я просто готов к этому случаю и использую блок try / Кроме того, чтобы поймать необычные числа. Тем не менее, я был бы счастлив, если бы мог преобразовать их в целые числа. Есть ли последовательный способ сделать это?

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Я не знаю, сколько вам повезет, но Unicodedata может справиться с некоторыми случаями (код Python 3):

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

Чуть лучше. Что касается тестирования, если вы хотите использовать int, вы можете просто использовать int () и поймать исключение.

0 голосов
/ 03 июля 2018

Лучший способ узнать, можно ли преобразовать строку в int, - просто набрать try it:

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

Конечно, вы можете попытаться определить правильный способ проверки строки заранее, но почему? Если вы хотите использовать правило "все, что int принимает", просто используйте 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).

0 голосов
/ 03 июля 2018

Если вы хотите проверить, может ли строка быть передана в int, используйте str.isdecimal. И str.isnumeric, и str.isdigit содержат десятичные символы, несовместимые с int.

И как @abarnert упомянул в комментариях, самый гарантированный способ проверить, может ли строка быть передана в int, это просто сделать это в блоке try.

С другой стороны, «⒍» можно преобразовать в фактическую цифру с помощью модуля unicodedata, например,

print(unicodedata.digit('⒍'))

выдаст 6.

...