如何在Python中将数字转换为字符串后添加千位分隔符?

5
在我的场景中(Python 2.7),我有:
str(var)
其中var是一个变量,有时需要千位分隔符,例如1,500,但已转换为字符串(用于串联目的)。
我想将该变量作为带有千位分隔符的字符串打印出来。
我已经阅读了添加数字格式的解决方案。
>>> '{:20,.2}'.format(f)
'18,446,744,073,709,551,616.00'

来自https://dev59.com/8XI-5IYBdhLWcg3wf4dD#1823189

但这似乎只适用于数字,而不适用于已转换为字符串的数字。

谢谢。

编辑:更具体的情况是,这是我的实现场景:

print 'the cost = $' + str(var1) + '\n'
print 'the cost = $' + str(var2) + '\n'

我有几个“变量”。

2个回答

8
不要使用 str(var) 和字符串拼接,这就是 .format() 要用的。根据 var 的类型选择以下之一:
'{:,}'.format(var)    # format an integer
'{:,.2f}'.format(var) # format a decimal or float

具体取决于您所拥有的数字类型。

>>> var = 12345678.123
>>> '{:,}'.format(int(var))  # ignore the `.123` part
'12,345,678'
>>> '{:,.2f}'.format(var)
'12,345,678.12'

谢谢,我的实现是print 'the cost = $' + str(var) + '\n',那么在这种情况下我该如何应用这个逻辑呢?谢谢。 - user1063287
1
不需要使用str(var),请改用'the cost = ${:,.2f}\n'.format(var) - Martijn Pieters
@user1063287:事实上,你的情况要简单得多。如果可以使用字符串格式化,则不要使用字符串连接。 - Martijn Pieters
非常感谢,我会采纳您的建议。当我使用print 'the cost = $' + '{:20,}'.format(int(var)) + '\n'时,在输出值之前出现了大量的“缩进”或“空格”。 - user1063287
@user1063287:你可能想阅读一下格式化语法规范;我更新了答案。 - Martijn Pieters

0

我看到这个问题时已经很晚了,当时我正在寻找同样的解决方案。

使用 format(), 表示法可以很好地解决问题,但会带来一些问题,因为不幸的是 , 表示法不能应用于字符串。所以,如果你从数字的文本表示开始,那么在调用 format() 之前,你必须将它们转换为整数或浮点数。如果你需要处理整数和浮点数,并需要保留不同精度的变化水平,则 format() 代码会迅速变得相当复杂。为了处理这种情况,我最终编写了自己的代码,而没有使用 format()。它使用最广泛使用的千位分隔符(,)和小数点标记(.),但显然可以非常快速地修改以适应其他地区的表示法或用于创建适用于所有语言环境的解决方案。

def separate_thousands_with_delimiter(num_str):
    """
    Returns a modified version of "num_str" with thousand separators added.
    e.g. "1000000" --> "1,000,000", "1234567.1234567" --> "1,234,567.1234567".
    Numbers which require no thousand separators will be returned unchanged.
    e.g. "123" --> "123", "0.12345" --> "0.12345", ".12345" --> ".12345".
    Signed numbers (a + or - prefix) will be returned with the sign intact.
    e.g. "-12345" --> "-12,345", "+123" --> "+123", "-0.1234" --> "-0.1234".
    """

    decimal_mark = "."
    thousands_delimiter = ","

    sign = ""
    fraction = ""

    # If num_str is signed, store the sign and remove it.
    if num_str[0] == "+" or num_str[0] == "-":
        sign = num_str[0]
        num_str = num_str[1:]

    # If num_str has a decimal mark, store the fraction and remove it.
    # Note that find() will return -1 if the substring is not found.
    dec_mark_pos = num_str.find(decimal_mark)
    if dec_mark_pos >= 0:
        fraction = num_str[dec_mark_pos:]
        num_str = num_str[:dec_mark_pos]

    # Work backwards through num_str inserting a separator after every 3rd digit.
    i = len(num_str) - 3
    while i > 0:
        num_str = num_str[:i] + thousands_delimiter + num_str[i:]
        i -= 3

    # Build and return the final string.
    return sign + num_str + fraction


# Test with:

test_nums = ["1", "10", "100", "1000", "10000", "100000", "1000000",
             "-1", "+10", "-100", "+1000", "-10000", "+100000", "-1000000",
             "1.0", "10.0", "100.0", "1000.0", "10000.0", "100000.0",
             "1000000.0", "1.123456", "10.123456", "100.123456", "1000.123456",
             "10000.123456", "100000.123456", "1000000.123456", "+1.123456",
             "-10.123456", "+100.123456", "-1000.123456", "+10000.123456",
             "-100000.123456", "+1000000.123456", "1234567890123456789",
             "1234567890123456789.1", "-1234567890123456789.1",
             "1234567890123456789.123456789", "0.1", "0.12", "0.123", "0.1234",
             "-0.1", "+0.12", "-0.123", "+0.1234", ".1", ".12", ".123",
             ".1234", "-.1", "+.12", "-.123", "+.1234"]

for num in test_nums:
    print("%s --> %s" % (num, separate_thousands_with_delimiter(num)))


# Beginners should note that an integer or float can be converted to a string
# very easily by simply using: str(int_or_float)

test_int = 1000000
test_int_str = str(test_int)
print("%d --> %s" % (test_int, separate_thousands_with_delimiter(test_int_str)))

test_float = 1000000.1234567
test_float_str = str(test_float)
print("%f --> %s" % (test_float, separate_thousands_with_delimiter(test_float_str)))

希望这能有所帮助。 :)

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