2016-12-29 65 views
2

我想要使用千位分隔符來格式化包含小數點和浮點數的字符串。我試過了:爲字符串類型變量定製千分隔符

但它不能使用字符串類型的參數!

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

谷歌搜索解決方案,但找不到任何滿足我的需求的解決方案。

我的樣本輸入:"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. 

工作還行,但有沒有其他方式比這更好?

回答

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可以做到這一點就其本身而言,創建一個小的功能,將追加'.'如果存在的話,什麼也不做,如果它不:

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 
+2

你也可以叫'decimal.Decimal',而不是'float',以避免四捨五入,準確地保留尾隨零。 – user2357112

+0

@ Jim和&user2357112:謝謝各位!除案件外很好:>>> num_str =「123456.」 >>> {:,}「。格式(十進制(num_str))>>>'123,456'(它應該是沒有點返回) 但我目前正在使用GUI/PyQt5計算器項目需要提到的情況下通過keyPressEvent()顯示用戶輸入,我想除了定製的方式來滿足這個需求沒有別的辦法,如果還有其他方法,請讓我知道。 – smearumi

+1

@smearumi你可以創建一個更短的定製版本,看看我更新的答案,看看它是否有訣竅。 –