【问题标题】:Customized thousand separator for string type variable字符串类型变量的自定义千位分隔符
【发布时间】:2016-12-29 23:02:56
【问题描述】:

我想使用千位分隔符格式化包含小数点和浮点数的字符串。我试过了:

"{:,}".format() 

但它不适用于字符串类型的参数!

>>> num_str = "123456.230"
>>> "{:,}".format(num_str)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Cannot specify ',' with 's'.
>>>

用 Google 搜索解决方案,但找不到任何满足我需求的解决方案。

我的示例输入:"123456.0230"

我想要的示例输出是:"123,456.0230"

我自己写的代码如下:

input_str = ''
output_str = ''
lenth = 0

input_str = input("Input a number: ")

for i in input_str:
    if input_str[lenth] == '.':
        break
    lenth += 1

if lenth % 3 == 0:
    pos_separator = 3
else:
    pos_separator = lenth % 3

for i in range(0, lenth):
    if i == pos_separator:
        output_str += ',' + input_str[i]
        pos_separator += 3
    else:
        output_str += input_str[i]

output_str += input_str[lenth:]

print("Output String: ", output_str)

样品 1:

>>> Input a number: 123456.0230
>>> Output String:  123,456.0230

示例 2:

>>> Input a number: 12345.
>>> Output String:  12,345.

工作正常,但有没有比这更好的方法?

【问题讨论】:

    标签: python string performance python-3.x


    【解决方案1】:

    可以把它变成一个浮点数然后然后应用它:

    >>> "{:,}".format(float(num_str))
    '123,456.23'
    
    >>> "{:,}".format(float(12345))
    '12,345.0'
    

    如果需要,您还可以使用 'g' 说明符删除尾随零:

    >>> "{:,g}".format(float(12345))
    '12,345'
    

    正如@user2357112 在评论中指出的那样,您最好可以导入Decimal 并将其输入.format

    >>> from decimal import Decimal
    >>> "{:,}".format(Decimal(num_str))
    '123,456.230'
    

    因为你也有case作为尾随点,它需要被保留,因为我想不出.format可以自己做到这一点,创建一个小函数,如果它存在,将附加'.'如果没有,则什么也不做:

    def format_str(s):
        fstr = "{:,}".format(Decimal(s))
        return fstr + ('.' if s[-1] == '.' else '')
    

    其中,对于某些测试用例:

    for s in ['12345', '12345.', '1234.5']:
        print(format_str(s))
    

    产量:

    12,345
    12,345.
    1,234.5
    

    【讨论】:

    • 您也可以调用decimal.Decimal 而不是float,以避免四舍五入并准确保留尾随零。
    • @Jim and & user2357112:谢谢你们!效果很好,除了这种情况:>>> num_str = "123456." >>> {:,}".format(Decimal(num_str)) >>> '123,456' (返回时不带点)。但我目前正在使用 GUI/PyQt5 开发一个计算器项目,它需要提到通过keyPressEvent()显示用户输入的案例。我想除了定制的方式来满足这种需求之外别无他法。如果有任何其他方式,请告诉我。问候。
    • @smearumi 您可以为它创建一个更短的自定义版本,看看我更新的答案,看看它是否有效。
    • @吉姆:谢谢! 100%完美把戏,100%满意!竖起大拇指! :))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2015-10-30
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2018-06-22
    相关资源
    最近更新 更多