在Python中,将括号(字符串)中的数字转换为负整数(或浮点数)的最简单方法是什么?
例如,'(4,301)'到-4301,这在会计应用程序中经常遇到。
答案 0 :(得分:13)
最简单的方法是:
my_str = "(4,301)"
num = -int(my_str.translate(None,"(),"))
答案 1 :(得分:7)
由于您正在阅读一个放入数千个分隔符的系统,因此值得一提的是我们并未在全世界使用它们,因此您应该考虑使用区域设置系统。考虑:
import locale
locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' )
my_str = "(4,301)"
result = -locale.atoi(my_str.translate(None,"()"))
答案 2 :(得分:2)
假设只删除,
足够安全,并且您可能希望将相同的函数应用于可能包含否定数字的值,则:
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))
答案 3 :(得分:2)
据推测,你想要处理正数和负数,这是迄今为止许多答案所缺少的。我要在answer from mogul添加一点。
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)
答案 4 :(得分:0)
此代码可能会更长一点,但直接且易于维护
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
答案 5 :(得分:0)
对于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)
答案 6 :(得分:0)
对于本地号码,我使用这个:
def clean_number(text):
import locale
locale.setlocale(locale.LC_NUMERIC, "Portuguese_Brazil.1252")
tbl = str.maketrans('(', '-', 'R$ )')
return locale.atof(text.translate(tbl))
适用于Python 3.8。 第一个括号用减号替换,第二个括号被删除。 同时删除空格和货币符号。