В Python, какой самый простой способ преобразовать число, заключенное в круглые скобки (string) в отрицательное целое число (или float)?
Например, "(4,301)" -4301, как обычно встречается в приложениях учета.
В Python, какой самый простой способ преобразовать число, заключенное в круглые скобки (string) в отрицательное целое число (или float)?
Например, "(4,301)" -4301, как обычно встречается в приложениях учета.
Самый простой способ:
my_str = "(4,301)"
num = -int(my_str.translate(None,"(),"))
Поскольку вы читаете из системы, которая помещается в разделители тысяч, стоит упомянуть, что мы не используем их одинаково во всем мире, поэтому вам следует рассмотреть возможность использования языковой системы. Рассмотрим:
import locale
locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' )
my_str = "(4,301)"
result = -locale.atoi(my_str.translate(None,"()"))
Предполагая, что удаление ,
достаточно безопасно, и вы можете применить ту же функцию к значениям, которые могут содержать отрицательные числа, или нет:
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))
Предположительно, вы хотите обрабатывать положительные числа, а также отрицательные, которые отсутствуют во многих ответах до сих пор. Я немного добавлю ответ от магната.
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)
Этот код может быть немного длиннее, но прямой и простой в обслуживании
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
Для 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)