У меня есть строка, представляющая число, в котором для разделения тысяч используются запятые. Как я могу преобразовать это в число в Python?
>>> int("1,000,000")
Создает ValueError
.
Я мог бы заменить запятые пустыми строками, прежде чем пытаться преобразовать их, но это почему-то кажется неправильным. Есть ли способ лучше?
'C'
этого все равно будетValueError
!).Traceback (most recent call last): File "F:\test\locale_num.py", line 2, in <module> locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' ) File "F:\Python27\lib\locale.py", line 539, in setlocale return _setlocale(category, locale) locale.Error: unsupported locale setting
Есть несколько способов разобрать числа с разделителями тысяч. И я сомневаюсь, что способ, описанный @unutbu, лучший во всех случаях. Поэтому я перечисляю и другие способы.
Правильное место для вызова
setlocale()
находится в__main__
модуле. Это глобальная настройка, которая повлияет на всю программу и даже расширения C (хотя обратите внимание, что настройка LC_NUMERIC не установлена на системном уровне, а эмулируется Python). Прочтите предостережения в документации и дважды подумайте, прежде чем идти этим путем. Возможно, это нормально для отдельного приложения, но никогда не используйте его в библиотеках для широкой аудитории. Вероятно, вам следует избегать запроса локали с какой-либо конкретной кодировкой, поскольку она может быть недоступна в некоторых системах.Используйте одну из сторонних библиотек для интернационализации. Например, PyICU позволяет использовать любую доступную локаль без влияния на весь процесс (и даже анализировать числа с определенными разделителями тысяч без использования локалей):
NumberFormat.createInstance (Locale ('en_US')). Parse ("1000000"). GetLong ()
Напишите свою собственную функцию синтаксического анализа, если вы не знаете, что устанавливать сторонние библиотеки, чтобы сделать это "правильно". Это может быть так просто, как
int(data.replace(',', ''))
если бы строгая проверка не нужна.источник
setlocate
должно бытьsetlocale
). Также +1.Замените запятые пустыми строками и превратите полученную строку в символ
int
илиfloat
.>>> a = '1,000,000' >>> int(a.replace(',' , '')) 1000000 >>> float(a.replace(',' , '')) 1000000.0
источник
Это работает:
(Грязный, но быстрый способ)
>>> a='-1,234,567,89.0123' >>> "".join(a.split(",")) '-123456789.0123'
источник
Я получил ошибку локали из принятого ответа, но здесь, в Финляндии (Windows XP) работает следующее изменение:
import locale locale.setlocale( locale.LC_ALL, 'english_USA' ) print locale.atoi('1,000,000') # 1000000 print locale.atof('1,000,000.53') # 1000000.53
источник
Я пробовал это. Это выходит за рамки вопроса: вы получаете ввод. Сначала он будет преобразован в строку (если это список, например из Beautiful soup); затем в int, затем в float.
Он идет так далеко, как только может. В худшем случае он возвращает все не преобразованное в виде строки.
def to_normal(soupCell): ''' converts a html cell from beautiful soup to text, then to int, then to float: as far as it gets. US thousands separators are taken into account. needs import locale''' locale.setlocale( locale.LC_ALL, 'english_USA' ) output = unicode(soupCell.findAll(text=True)[0].string) try: return locale.atoi(output) except ValueError: try: return locale.atof(output) except ValueError: return output
источник
>>> import locale >>> locale.setlocale(locale.LC_ALL, "") 'en_US.UTF-8' >>> print locale.atoi('1,000,000') 1000000 >>> print locale.atof('1,000,000.53') 1000000.53
это сделано на Linux в США.
источник
#python3 tenzin def changenum(data): foo = "" for i in list(data): if i == ",": continue else: foo += i return float(int(foo))
источник