Конвертировать десятичную метку

У меня есть файл CSV с чтением данных, который я хочу прочитать в Python. Я получаю списки, содержащие строки типа "2,5". Теперь выполнение float("2,5") не работает, потому что оно имеет неправильную десятичную метку.

Как я прочитал это в Python как 2.5?

Ответы

Ответ 1

float("2,5".replace(',', '.')) будет делать в большинстве случаев

Если value - большое число, а . используется для тысяч, вы можете:

Заменить все запятые для точек: value.replace(",", ".")

Удалите все, кроме последней точки: value.replace(".", "", value.count(".") -1)

Ответ 2

Вы можете сделать это с учетом языка:

import locale

# Set to users preferred locale:
locale.setlocale(locale.LC_ALL, '')
# Or a specific locale:
locale.setlocale(locale.LC_NUMERIC, "en_DK.UTF-8")

print locale.atof("3,14")

Перед использованием этого метода прочитайте этот раздел.

Ответ 4

с использованием регулярного выражения будет более надежным

import re

decmark_reg = re.compile('(?<=\d),(?=\d)')

ss = 'abc , 2,5 def ,5,88 or (2,5, 8,12, 8945,3 )'

print ss
print decmark_reg.sub('.',ss)

результат

abc , 2,5 def ,5,88 or (2,5, 8,12, 8945,3 )
abc , 2.5 def ,5.88 or (2.5, 8.12, 8945.3 )

Если вы хотите обрабатывать более сложные случаи (цифры без цифры до десятичной метки для примера), вам может быть интересным регулярное выражение I, созданное для обнаружения всех типов чисел в следующем потоке:

fooobar.com/questions/81407/...

Ответ 5

Попробуйте заменить все десятичные запятые на десятичные точки:

floatAsStr = "2,5"
floatAsStr = floatAsStr.replace(",", ".");
myFloat = float(floatAsStr)

Функция replace, конечно, работает с любой подстрокой, поскольку python теперь различает char и строку.

Ответ 6

Сначала вы должны убедиться, какая локаль была использована для предоставления номера. Несоблюдение этого правила может привести к случайным проблемам.

import locale

loc = locale.getlocale()  # get and save current locale
# use locale that provided the number;
# example if German locale was used:
locale.setlocale(locale.LC_ALL, 'de_DE')
pythonnumber = locale.atof(value)
locale.setlocale(locale.LC_ALL, loc)  # restore saved locale