将数字数组格式化为具有最小宽度的货币

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%

【讨论】:

以上是关于将数字数组格式化为具有最小宽度的货币的主要内容,如果未能解决你的问题,请参考以下文章

如何仅使用货币代码将数字格式化为货币?

如何将数字格式化为货币字符串

将数字格式化为货币金额

如何使用正则表达式将数字格式化为货币

如何使用 javascript/jquery 将数字格式化为印度货币(在数据表中)

PHP number_format():将数字四舍五入,然后格式化为货币