Python:用括号格式化负数

2024-06-26 01:47:44 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以使用字符串插值或string.format将负数呈现为使用括号而不是“负号”格式化的文本?

-3.14应该是(3.14)

我希望使用字符串插值或string.format来实现这一点,而不是需要专门为货币或会计设计的导入。

编辑以澄清:请假定要格式化的变量是intfloat。一、 e.虽然这可以用正则表达式来实现(见下面的好答案),但我认为这将是Python格式化功能的一个更本机的操作。

所以要说清楚:

import numpy as np
list_of_inputs = [-10, -10.5, -10 * np.sqrt(2), 10, 10.5, 10 * np.sqrt(2)]
for i in list_of_inputs:
    # your awesome solution goes here

应返回:

(10)
(10.5)
(14.14)
10
10.5
14.14

显然,最后一个问题有一些灵活性。我希望“将负数放入括号”是字符串插值或string.format的自然参数,以便在设置负数的显示样式时可以使用其他格式语言。


Tags: of字符串文本format编辑stringnp货币
3条回答

Pandas有一个floats的显示选项,numpy有一个任何数据类型的显示选项:

In [11]: df = pd.DataFrame([[1., -2], [-3., 4]], columns=['A', 'B'])

注意:A是浮点列,B是int列。

我们可以根据数字的符号编写一个简单的格式化程序:

In [12]: formatter = lambda x: '(%s)' % str(x)[1:] if x < 0 else str(x)

In [13]: pd.options.display.float_format = formatter

In [14]: df  # doesn't work for the int column  :(
Out[14]:
      A  B
0   1.0  2
1 (3.0)  4

In [15]: df.astype(float)
Out[15]:
      A     B
0   1.0 (2.0)
1 (3.0)   4.0

您还可以配置numpy的打印选项:

In [21]: df.values # float
Out[21]:
array([[1., 2.],
       [3., 4.]])

In [22]: df['B'].values # int
Out[22]: array([2,  4])

In [23]: np.set_printoptions(formatter={'int': formatter, 'float': formatter})

In [24]: df.values # float
Out[24]:
array([[1.0, (2.0)],
       [(3.0), 4.0]])

In [25]: df['B'].values # int
Out[25]: array([(2), 4])

注意:这不会改变数据的存储方式,只是改变您查看数据的方式。

如果您只需要处理可能为负数的输入:

print '{0:.2f}'.format(num) if num>=0 else '({0:.2f})'.format(abs(num))

这就是格式化程序类的子类的用途。请尝试以下操作:

import string
class NegativeParenFormatter(string.Formatter):
    def format_field(self, value, format_spec):
        try:
            if value<0:
                return "(" +  string.Formatter.format_field(self, -value, format_spec) + ")"
            else:
                return string.Formatter.format_field(self, value, format_spec)
        except:
            return string.Formatter.format_field(self, value, format_spec)

f = NegativeParenFormatter()
print f.format("{0} is positive, {1} is negative, {2} is a string", 3, -2, "-4")

这张照片:

'3 is positive, (2) is negative, -4 is a string'

相关问题 更多 >