将浮点数转换为逗号分隔的字符串

14

如何将一个浮点数转换为其'会计形式' --

100028282.23 --> 100,028,282.23
100028282 --> 100,028,282.00

有没有一个Python方法可以做到这一点?


6
将货币金额存储为浮点数可能不是一个好的选择。 - NPE
你能解释一下为什么吗?我很好奇,因为在我看来,浮点数使计算变得容易。 - Clement Osei Tano
@ClementOseiTano 浮点数在财务计算方面效果不佳。 - David542
3个回答

24

除了beerbajay的优秀答案之外,简单的字符串格式化在2.7+中也可以使用,而不需要导入任何内容:

>>> '{0:,.2f}'.format(24322.34)
'24,322.34'

15
你可以使用locale.format()函数来实现这一点:
>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'en_US.utf8')
'en_US.utf8'
>>> locale.format("%.2f", 100028282.23, grouping=True)
'100,028,282.23'
请注意,您必须提供精度:%.2f 或者,您可以使用locale.currency()函数,该函数遵循LC_MONETARY设置:
>>> locale.currency(100028282.23)
'$100028282.23'

3

对于金融应用来说,decimal 模块是进行浮点数计算的好选择。要使用逗号显示十进制浮点数,请参见moneyfmt 配方:

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

    >>> d = Decimal('-1234567.8901')
    >>> moneyfmt(d, curr='$')
    '-$1,234,567.89'
    >>> moneyfmt(d, places=0, sep='.', dp='', neg='', trailneg='-')
    '1.234.568-'
    >>> moneyfmt(d, curr='$', neg='(', trailneg=')')
    '($1,234,567.89)'
    >>> moneyfmt(Decimal(123456789), sep=' ')
    '123 456 789.00'
    >>> moneyfmt(Decimal('-0.02'), neg='<', trailneg='>')
    '<0.02>'

    """
    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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接