У меня возникла странная ошибка, которую я никогда раньше не видел, и я попытался найти информацию в Интернете, но безуспешно.

Я пытаюсь сделать простую вещь, преобразовав str во flaot. Когда я печатаю значение в классическом числовом стиле (37442.20), но когда я хочу преобразовать его в flaot, я получаю сообщение об ошибке, показывающее значение в виде комбинации числа и буквы (37 \ u202f442.20). Я получаю следующие строки:

print(value)
print(type(value))

37 442.20
<class 'str'>

print(float(value))
ValueError: could not convert string to float: '37\u202f442.20'

Кто-нибудь знает, что здесь не так?

0
Jojo 16 Янв 2021 в 19:12

3 ответа

Лучший ответ
s = "37 442.20"

print (float(s.replace(' ','').encode('ascii', 'ignore')))

Выход:

37442.2

У вас есть проблемы как с пространством, так и с кодировкой.

Таким образом, вы используете метод replace() для своей строки и encode(), чтобы пройти через каждую и распечатать свой float.

Чтобы избежать ошибки при преобразовании списка смешанных нецифровых строк и строк цифр и с учетом вашей проблемы с кодированием, вы можете сделать:

import re

sl = ["37 442.20","aaa.83","4a3.","aaaa","345"]

for s in sl:
    s = s.replace(' ','').encode('ascii', 'ignore')
    if re.match(b"^([0-9]+){0,1}[.]{0,1}([0-9]+)$",s):
        print (float(s))
    else:
        print ("%s not digit" % s.decode())

Выход:

37442.2
aaa.83 not digit
4a3. not digit
aaaa not digit
345.0
1
Synthase 16 Янв 2021 в 16:29

Просто потому, что между цифрами есть пробелы. Удалите пробелы и передайте значение float, и все должно работать нормально.

Один из способов сделать это:

value = “”.join(‘37 442.20’.split())
print(float(value))
2
Jacob Lee 16 Янв 2021 в 16:16

Символ \u202f не является нормальным пробелом. https://www.fileformat.info/info/unicode/char/ 202f / index.htm

Вы можете попробовать удалить их перед преобразованием. Например: u'37\u202f442.20'.encode('ascii', 'ignore')

0
Kotori0 16 Янв 2021 в 16:17
65751712