2016-12-29 5 views
2

Ich möchte meine Zeichenkette, die sowohl Dezimal als auch Fließkomma enthält, mit Tausendertrennzeichen formatieren. Ich habe versucht:Angepasstes Tausendertrennzeichen für Zeichenkettentypvariable

aber es funktioniert nicht mit einem Argument der Zeichenfolge Typ!

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

gegoogelt für Lösung (en), konnte aber keine Lösung nicht gefunden (en), die meine Bedürfnisse zu befriedigen.

Mein Abtastwerteingang: "123456.0230"

Ausgabe Meine gewünschte Probe zu sein: "123,456.0230"

schrieb ich meinen eigenen Code, der wie folgt lautet:

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 

Probe 2:

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

Arbeiten in Ordnung, aber gibt es einen besseren Weg?

Antwort

6

Sie können es nur einen Schwimmer machen und dann gelten:

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

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

Sie können auch die 'g' Spezifizierer verwenden nachfolgende Nullen zu entfernen, falls erforderlich:

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

Wie spitze out von @ user2357112 in einem Kommentar, könnten Sie optimal Decimal importieren und das in .format stattdessen einspeisen:

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

Da Sie auch Fälle, wie der abschließende Punkt haben, wo sie aufbewahrt werden muss und da ich nicht einen Weg finden kann .format dies allein tun kann, erstellen Sie eine kleine Funktion, die '.' anhängt wenn es vorhanden ist und nichts zu tun, wenn es nicht:

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

Welche, für einige Testfälle:

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

ergibt:

12,345 
12,345. 
1,234.5 
+2

Sie auch 'decimal.Decimal' statt' float' nennen könnte, Runden zu vermeiden und genau nachgestellten Nullen bewahren. – user2357112

+0

@ Jim und & user2357112: Danke Jungs! funktioniert super bis auf den Fall: >>> num_str = "123456". >>> {:,} ". format (Dezimal (num_str)) >>> '123,456' (das ohne Punkt zurückkommt, wie es sein sollte). Aber ich arbeite gerade an einem Rechnerprojekt mit GUI/PyQt5, das Englisch: www.mjfriendship.de/en/index.php?op...39&Itemid=32 Ich denke, es gibt keinen anderen Weg als die benutzerdefinierte Methode, um diese Anforderung zu erfüllen. Wenn es einen anderen Weg gibt, lass es mich wissen. – smearumi

+1

@smearumi Sie können eine angepasste Version für die noch kürzere erstellen, werfen Sie einen Blick auf meine aktualisierte Antwort und sehen, ob es den Trick macht. –

Verwandte Themen