将数字数组格式化为具有最小宽度的货币
Posted
技术标签:
【中文标题】将数字数组格式化为具有最小宽度的货币【英文标题】:Format array of numbers as currency with minimum width between values 【发布时间】:2018-06-21 16:09:57 【问题描述】:我有一些花车清单:
arr1 = [ 123456.78, 123.45, -123456789.01, 23.45 ]
arr2 = [ .1278, .92, .5401, .2345 ]
我想以各种格式以表格形式打印它们,具体取决于我要打印的值列表
例如:
将arr1
打印为带有千位分隔符的完整美元值
以百分比形式打印arr2
,保留一位小数
会导致如下结果:
" $123,457 | $123 | -$123,456,789 | $23"
" 12.8% | 92.0% | 54.0% | 23.4%"
这是我目前所能想到的:
def join(fmt, arr):
return ' | '.join([fmt.format(a) for a in arr])
print(''.format(join('$:14,.0f', arr1)))
print(''.format(join(':15.1%', arr2)))
这会导致以下结果:
"$ 123,457 | $ 123 | $ -123,456,789 | $ 23"
" 12.8% | 92.0% | 54.0% | 23.4%"
这种方法的问题:
它首先打印美元符号,然后是填充 它在美元符号后打印负号 由于美元符号不是格式的一部分,我必须记住将该格式字符串的填充从 15 减少到 14。如何在数字上打印美元符号? 是否可以将美元符号作为格式的一部分,以便我仍然可以使用 15 作为填充?
【问题讨论】:
看看docs.python.org/3/library/locale.html#locale.currency @PM2Ring 我将如何在我的join
函数中使用locale.currency
,或者我必须特殊情况下的货币打印?
是的,您需要将货币视为特殊情况。使用locale
的另一个选项是分两个阶段进行格式化。首先格式化数字并添加货币符号和可能的负号。然后做填充。如果您可以使用 Python 3.6+ f-strings,这会更紧凑。
@PM2Ring 另外我不确定我是否可以降低价值中的美分? (即:仅打印美元值)
@PM2Ring 我正在使用 python 3.6.5
【参考方案1】:
以下是如何使用 Python 3.6 f-strings 将货币值格式化为整美元。我们也可以在dollars
函数中使用.rjust
进行填充,但单独进行会更简洁、更灵活。
arr1 = [123456.78, 123.45, -123456789.01, 23.45]
def dollars(n):
return f"'-' if n < 0 else ''$round(abs(n)):,"
s = ' | '.join([dollars(u).rjust(15) for u in arr1])
print(repr(s))
输出
' $123,457 | $123 | -$123,456,789 | $23'
确保round(abs(n))
做你想做的事。 round
函数执行"Banker's rounding",您可能希望使用int(0.5 + x)
而不是round(x)
。还要考虑舍入后取绝对值而不是之前取绝对值的效果。
【讨论】:
【参考方案2】:这应该为你做:
dollar_commas = ''.join("$:, | ".format(int(round(num))).rjust(20) for num in arr1).replace('$-', '-$')
print dollar_commas[:-2]
percent = ''.join("0:.1% | ".format(num).rjust(20) for num in arr2)
print percent[:-2]
输出:
$123,457 | $123 | -$123,456,789 | $23
12.8% | 92.0% | 54.0% | 23.4%
【讨论】:
以上是关于将数字数组格式化为具有最小宽度的货币的主要内容,如果未能解决你的问题,请参考以下文章