2016-12-29 9 views
2

小数点と浮動小数点の両方を含む文字列を1000個のセパレータを使用してフォーマットしたいとします。私は試しました:文字列型変数の1000セパレータをカスタマイズしました

しかし、それは文字列型の引数で動作していません!

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

ググ溶液(S)のための私のニーズを満たす任意の解決策(複数可)を見つけることができませんでした。

私のサンプル入力:"123456.0230"

マイ所望のサンプル出力はすべき:SAMPE 1

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) 

"123,456.0230"

私は次のようである私自身のコードを書いた

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

サンプル2:

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

問題はありませんが、他の方法はこれよりも優れていますか?

答えて

6

あなたちょうどは、それを適用し、それフロートと行うことができます:あなたはまた、必要に応じて、後続のゼロを削除する'g'指定子を利用することができ

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

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

:尖ったとして

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

あなたはまた、丸め避け、正確に末尾のゼロを維持するために、代わりに '' float'のdecimal.Decimal'を呼び出すことができます。 – user2357112

+0

@ Jimと&user2357112:ありがとう!大文字と小文字は区別されます:>>> num_str = "123456" >>> {:、} "。format(Decimal(num_str))>>> '123,456'(ドットのない状態で戻る) 私は現在、GUI/PyQt5を使った電卓プロジェクトに取り組んでいます。 keyPressEvent()によってユーザー入力を表示するための上記のケースが必要です。他の方法はありませんが、このニーズを満たすためのカスタマイズされた方法はないと思います。 – smearumi

+1

@smearumiさらに短くなったカスタマイズされたバージョンを作成して、私の更新された答えを見て、そのトリックがあるかどうかを確認することができます。 –

関連する問題