Подтвердить что ты не робот

Преобразовать число, заключенное в круглые скобки (строку) в отрицательное целое число (или float) с помощью Python?

В Python, какой самый простой способ преобразовать число, заключенное в круглые скобки (string) в отрицательное целое число (или float)?

Например, "(4,301)" -4301, как обычно встречается в приложениях учета.

4b9b3361

Ответ 1

Самый простой способ:

my_str = "(4,301)"
num = -int(my_str.translate(None,"(),"))

Ответ 2

Поскольку вы читаете из системы, которая помещается в разделители тысяч, стоит упомянуть, что мы не используем их одинаково во всем мире, поэтому вам следует рассмотреть возможность использования языковой системы. Рассмотрим:

import locale
locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' )
my_str = "(4,301)"
result = -locale.atoi(my_str.translate(None,"()"))

Ответ 3

Предполагая, что удаление , достаточно безопасно, и вы можете применить ту же функцию к значениям, которые могут содержать отрицательные числа, или нет:

import re
print float(re.sub(r'^\((.*?)\)$', r'-\1', a).replace(',',''))

Затем вы можете связать это с помощью locale, как показали другие ответы, например:

import locale, re

locale.setlocale(locale.LC_ALL, 'en_GB.UTF-8')
print locale.atof(re.sub('^\((.*?)\)$', r'-\1', a))

Ответ 4

Предположительно, вы хотите обрабатывать положительные числа, а также отрицательные, которые отсутствуют во многих ответах до сих пор. Я немного добавлю ответ от магната.

import locale
locale.setlocale( locale.LC_ALL, '')
my_str = '( 4,301 )'
positive = my_str.translate(None, '()')
result = locale.atoi(positive) if positive == my_str else -locale.atoi(positive)

Ответ 5

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

from pyparsing import Word, nums, OneOrMore

integer = Word(nums)

text = "blah blah (4,301) blah blah " 

parser = OneOrMore(integer)

iterator = parser.scanString( text )

try:
    while True:
        part1 =  iterator.next()
        part2 =  iterator.next()
except:
    x =  part1[0][0][0] + '.' +part2[0][0][0]
    print -float(x)

Производит: -4.301

Ответ 6

Для Python 3.6, а также обрабатывает '-' как 0 и удаляет лишние пробелы:

def clean_num(num_string):
    bad_chars = '(),-'
    translator = str.maketrans('', '', bad_chars)
    clean_digits = num_string.translate(translator).strip()

    if clean_digits == '':
        return 0
    elif '(' in num_string:
        return -float(clean_digits)
    else:
        return float(clean_digits)