我需要以价格格式输出十进制数字
即
10 = 10.00 11.1 = 11.10
如何使用decimal.Decimal类实现此目的?
pad_zero(Decimal('10.0'))
>>>Decimal('10.00')
* 编辑: *格式方法不适合我的需要,因为我需要将其作为十进制传递,但我明白,我可以将其转换回以后,但是这样的 - 和 - 来回似乎有些不熟悉。
答案 0 :(得分:7)
试试这个:
Decimal('10.0').quantize(Decimal('1.00'))
答案 1 :(得分:2)
有一个很好的例子,说明如何将Decimal对象格式化为Python documentation for the decimal module中的“货币格式化字符串”。
我对它有多尴尬感到有些惊讶 - 通常Python中的格式化非常简单。
答案 2 :(得分:2)
我会按照Python Decimal documentation Recipes section中的moneyfmt
食谱。
此配方创建一个带小数值的函数,并返回格式化为货币的字符串。
>>> d = Decimal('10.0')
>>> moneyfmt(d, curr='$')
'$10.00'
以下是实际代码,复制了Decimal Recipe文档中的sans示例:
def moneyfmt(value, places=2, curr='', sep=',', dp='.',
pos='', neg='-', trailneg=''):
"""Convert Decimal to a money formatted string.
places: required number of places after the decimal point
curr: optional currency symbol before the sign (may be blank)
sep: optional grouping separator (comma, period, space, or blank)
dp: decimal point indicator (comma or period)
only specify as blank when places is zero
pos: optional sign for positive numbers: '+', space or blank
neg: optional sign for negative numbers: '-', '(', space or blank
trailneg:optional trailing minus indicator: '-', ')', space or blank
"""
q = Decimal(10) ** -places # 2 places --> '0.01'
sign, digits, exp = value.quantize(q).as_tuple()
result = []
digits = map(str, digits)
build, next = result.append, digits.pop
if sign:
build(trailneg)
for i in range(places):
build(next() if digits else '0')
build(dp)
if not digits:
build('0')
i = 0
while digits:
build(next())
i += 1
if i == 3 and digits:
i = 0
build(sep)
build(curr)
build(neg if sign else pos)
return ''.join(reversed(result))
答案 3 :(得分:2)
对于货币计算,我更喜欢这个。
>>> penny=Decimal('0.01')
>>> Decimal('10').quantize(penny)
Decimal('10.00')
这是罗嗦而明确的。
对于货币格式,我使用format()
。
答案 4 :(得分:1)
这应该很简单(如果你不使用S. Lott建议的decimal.Decimal类):
>>> decimal_fmt = "{:.2f}"
>>> x = 10
>>> print(decimal_fmt.format(x))
10.00
>>> x = 11.1
>>> print(decimal_fmt.format(x))
11.10
答案 5 :(得分:0)
在创建实例之前设置上下文的精度:
>>> getcontext().prec = 2
答案 6 :(得分:0)
使用语言环境 currency
。它与 Decimal 类完美配合。
import locale
locale.setlocale(locale.LC_ALL, '') # this sets locale to the current Operating System value
print(locale.currency(Decimal('1346896.67544'), grouping=True, symbol=True))
将在我的 Windows 10 中输出配置为巴西葡萄牙语:
R$ 1.346.896,68
它有点冗长,所以如果你经常使用它,也许最好预先定义一些参数并使用较短的名称并在 f 字符串中使用它:
fmt = lambda x: locale.currency(x, grouping=True, symbol=True)
print(f"Value: {fmt(1346896.67444)}"
它适用于 Decimal
和 float
。如果不需要,您可以将符号配置为 False
。
答案 7 :(得分:-2)
您可以使用Decimal('10.0')
而不是使用float('10.0')
,这将产生您需要的效果。
编辑:意识到您希望用2位小数代表它。在这种情况下,Python文档中有一个很好的示例,用于将Decimal()
对象转换为货币:http://docs.python.org/library/decimal.html#recipes