字符串类型变量

时间:2016-12-29 23:02:57

标签: python string performance python-3.x

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

"{:,}".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)

Sampe 1:

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

样本2:

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

工作还可以,但除此之外还有其他方法吗?

1 个答案:

答案 0 :(得分:6)

可以让它成为一个浮动,然后然后应用它:

>>> "{:,}".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'

由于你也有案例作为尾随点,需要保留它,因为我想不出.format可以自己做的方式,创建一个附加{{1}的小函数如果它存在则不执行任何操作:

'.'

对于某些测试用例:

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