十进制零填充

时间:2011-04-22 15:40:57

标签: python

我需要以价格格式输出十进制数字

10 = 10.00 11.1 = 11.10

如何使用decimal.Decimal类实现此目的?

pad_zero(Decimal('10.0'))
>>>Decimal('10.00')

* 编辑: *格式方法不适合我的需要,因为我需要将其作为十进制传递,但我明白,我可以将其转换回以后,但是这样的 - 和 - 来回似乎有些不熟悉。

8 个答案:

答案 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)}"

它适用于 Decimalfloat。如果不需要,您可以将符号配置为 False

答案 7 :(得分:-2)

您可以使用Decimal('10.0')而不是使用float('10.0'),这将产生您需要的效果。

编辑:意识到您希望用2位小数代表它。在这种情况下,Python文档中有一个很好的示例,用于将Decimal()对象转换为货币:http://docs.python.org/library/decimal.html#recipes