【问题标题】:Convert a number enclosed in parentheses (string) to a negative integer (or float) using Python?使用Python将括号中的数字(字符串)转换为负整数(或浮点数)?
【发布时间】:2013-05-23 15:59:33
【问题描述】:

在 Python 中,将括号中的数字(字符串)转换为负整数(或浮点数)的最简单方法是什么?

例如,会计应用程序中常见的“(4,301)”到 -4301。

【问题讨论】:

  • 我不知道有什么内置方法可以做到这一点。您可以使用locale 解析逗号分隔的整数,但您需要自己处理负数。
  • 奇怪,有locale.currency 走另一条路,但你想要我似乎找不到的相反的东西.. 这里已经问过同样的问题,但没有令人满意的答案@987654322 @

标签: python


【解决方案1】:

最简单的方法是:

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

【讨论】:

  • 哇,翻译太棒了!
  • 谢谢,这让我找到了int('(4,301)'.replace('(','-').translate(None,'), ')),这对我的目的来说已经足够了。
  • @PedroBraz:它不假设。如果没有括号,它就不会翻译任何内容,只会删除任何逗号。
  • true 说,但是减号在函数之外,因此即使括号不存在也会为负。我的意思是,我知道如果会解决这个问题,我只是在寻找一个干净的解决方案。非常感谢您的回答!
  • @PaulGriffiths,我认为 PedroBraz 指出,如果您将 my_str 设置为“4,301”,则 num 将设置为 -4301。从上面的评论中可以清楚地看出,这不是 silvernightstar 想要的行为,也可能不是 Pedro Braz 想要的行为 (stackoverflow.com/questions/16718648/…)。
【解决方案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】:

    对于 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) 
    

    【讨论】:

    • 为我工作!!我们可以用额外的坏字符更新 bad_chars 以获得所需的结果
    【解决方案5】:

    大概你想处理正数和负数,这是迄今为止许多答案中所缺少的。我将在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)
    

    【讨论】:

      【解决方案6】:

      对于本地化的数字,我使用这个:

      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。 第一个括号被减号替换,第二个被删除。 还会删除空格和货币符号。

      【讨论】:

        【解决方案7】:

        这段代码可能会有点长,但直截了当且易于维护

        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

        【讨论】:

          猜你喜欢
          • 2018-07-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-29
          • 1970-01-01
          • 1970-01-01
          • 2016-02-06
          • 2019-07-10
          相关资源
          最近更新 更多