有没有办法使用字符串插值或string.format
将负数呈现为使用括号而不是“负号”格式化的文本?
即。 -3.14
应为(3.14)
。
我原本希望使用字符串插值或string.format
来完成此操作,而不需要专门为货币或会计设计的导入。
编辑以澄清:请假设要格式化的变量是int
或float
。即虽然这可以通过正则表达式完成(请参阅下面的好答案),但我认为这将是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
的自然参数,以便在设置负数的显示样式时可以使用其他格式化语言。
答案 0 :(得分:4)
如果您只需要处理可能为负的数字输入:
print '{0:.2f}'.format(num) if num>0 else '({0:.2f})'.format(abs(num))
答案 1 :(得分:4)
这是formatter类的子类。请尝试以下方法:
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'
答案 2 :(得分:3)
Pandas有浮动的显示选项,numpy有任何dtype的显示选项:
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])
注意:这不会改变数据的存储方式,只会改变您查看数据的方式。
答案 3 :(得分:1)
最简单的方法是使用三元组。
num = -3.14
output = "({})".format(math.fabs(num)) if num < 0 else "{}".format(num)
我不记得这是否适用于直接打印语句而不是作业。当我得到翻译时,我会检查这个。
感谢LartS 3.x确认:我进一步确认反对(3.x和2.x)
print("({})".format(math.fabs(num)) if num < 0 else "{}".format(num))
有效吗
答案 4 :(得分:0)
也许你正在寻找类似的东西
float = -3.14
num= "(%(key)s)" %{ 'key': str(abs(float))} if float < 0 else str(float)
答案 5 :(得分:0)
您可以在Python print语句中使用条件:
print "%s%d%s" % ( "(" if (i<0) else(""), i, ")" if (i<0) else("") )