Как использовать Python для преобразования строки в число, если в ней есть запятые как разделители тысяч?

У меня есть строка, которая представляет число, которое использует запятые для разделения тысяч. Как я могу преобразовать это число в python?

>>> int("1,000,000")

Создает a ValueError.

Я могу заменить запятые пустыми строками, прежде чем попытаться преобразовать их, но это как-то не так. Есть ли лучший способ?

Ответ 1

import locale
locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' ) 
locale.atoi('1,000,000')
# 1000000
locale.atof('1,000,000.53')
# 1000000.53

Ответ 2

Есть несколько способов разобрать числа с разделителями тысяч. И я сомневаюсь, что способ, описанный @unutbu, является лучшим во всех случаях. Вот почему я перечисляю и другие способы.

  1. Правильное место для вызова setlocale() находится в модуле __main__. Это глобальная настройка и повлияет на всю программу и даже на расширения C (хотя обратите внимание, что настройка LC_NUMERIC не устанавливается на системном уровне, а эмулируется Python). Прочитайте предостережения в документации и дважды подумайте, прежде чем идти по этому пути. Это, вероятно, хорошо в одном приложении, но никогда не используйте его в библиотеках для широкой аудитории. Возможно, вам следует избегать запроса локали с определенной кодировкой charset, поскольку она может быть недоступна в некоторых системах.

  2. Используйте одну из сторонних библиотек для интернационализации. Например, PyICU позволяет использовать любую доступную локаль без влияния на весь процесс (и даже анализировать числа с определенными разделителями тысяч без использования локалей):

    NumberFormat.createInstance(Locale ( 'en_US')). Синтаксический ( "1000000"). GetLong()

  3. Напишите свою собственную функцию синтаксического анализа, если вам не нужно устанавливать сторонние библиотеки, чтобы сделать это "правильно". Это может быть так же просто, как int(data.replace(',', '')) когда строгая проверка не требуется.

Ответ 3

Замените запятые пустыми строками и превратите полученную строку в int или float.

>>> a = '1,000,000'
>>> int(a.replace(',' , ''))
1000000
>>> float(a.replace(',' , ''))
1000000.0

Ответ 4

Это работает:

(Грязный, но быстрый способ)

>>> a='-1,234,567,89.0123'
>>> "".join(a.split(","))
'-123456789.0123'

Ответ 5

Я получил ошибку локали из принятого ответа, но следующее изменение работает здесь, в Финляндии (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

Ответ 6

Я пробовал это. Это немного выходит за рамки вопроса: Вы получаете вход. Сначала он будет преобразован в строку (если это список, например, из Beautiful soup); затем к int, затем плавать.

Он доходит до того, насколько это возможно. В худшем случае он возвращает все неотвержденное как строку.

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

Ответ 7

#python3 tenzin
def changenum(data):
    foo = ""
    for i in list(data):
        if i == ",":
            continue
        else:
            foo += i
    return  float(int(foo))

Ответ 8

>>> 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 в США.