Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Formatierung in "write"


GuaAck - Do 16.01.20 00:05
Titel: Formatierung in "write"
Hallo,

mit write(x) mit x vom Typ float wird x mit dem "." als Dezimalzeichen gedruckt. Wenn ich so eine Reihe von Zahlen getrennt mit ";" in eine Datei mit der Endung CSV schreibe, dann könnte ich diese Datei mit EXCEL öffnen und hätte jede Zahl in einer eigenen Spalte.

Mit dem Punkt als Dezimalzeichen versteht EXCEL das als String und schreibt alles in eine Spalte.

Aktuell habe ich eine kleine Procedure, die in der fertigen Datei einfach alle "." durch"," ersetzt. Geht prima,leider werden aber auch ".", die nicht als Dezimalzeichen gemeint sind, gewandelt. Das ist nicht schlimm, das sind nicht viele und ich muss es ja nur für das abschließenden Dokument einmal per Hand in EXCEL korrigieren.

Die Alternative floattostrf geht natürlich, ist aber umständlich.

Meine Frage: Kann man nicht pauschal write und writeln anweisen, "," als Dezimalzeichen zu verwenden. (Ich nutze Delphi 7.)

Vielleicht hat ja wer damit Erfahrung,
viele Grüße
GuaAck


Gausi - Do 16.01.20 08:35

Schau mal nach DecimalSeparator. Das sollte sich auch auf write auswirken. Falls du die andere Richtung, also StroToFloat auch im Code hast, musst du da auch ggf. anpassen.


OlafSt - Do 16.01.20 11:33

Diese globale Variable sollte man nicht mehr verwenden. Besser so:

Delphi-Quelltext
1:
TF:=TFormatSettings.Create('en-US');                    


Alle Konvertierungsroutinen haben inzwischen einen overload mit einem weiteren Parameter, nämlich eben diesen FormatSettings. Ergo ersetzt man nun sein FloatToStr(f) durch ein FloatToStr(f, TF). Das TFormatSettings ist ein Record, der wird nicht per Free freigegeben, das geht von selbst !


Gausi - Do 16.01.20 11:40

@OlafST: Weiß ich, aber gibt es TFormatSettings schon in Delphi 7? Ich meine nicht, da lief das noch über die globalen Variablen ...


GuaAck - Do 16.01.20 18:58

Danke an Alle,

TFormatSettings gibt es auch schon in Delphi 7 und ich benutze das gelegentlich mit floattostrf. Das würde ohne Problem gehen.

NUR: "write(x)" ist viel einfacher als "write(floattostrf(x,fffixed, 8,3,Formatsettings))". Deshalb meine Frage, ob man nicht pauschal das Format für write umstellen kann.

Gausi schrieb "... sollte sich auch auf write auswirken...", aber wie kann ich denn die FormatSettings dafür setzen?

Gruß
GuaAck


OlafSt - Fr 17.01.20 00:44

user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:
Danke an Alle,
NUR: "write(x)" ist viel einfacher als "write(floattostrf(x,fffixed, 8,3,Formatsettings))". Deshalb meine Frage, ob man nicht pauschal das Format für write umstellen kann.


Anstelle des kryptischen FloatToStrF verwende ich immer FormatFloat('0.000',x,TF). Ist deutlich übersichtlicher.


Nersgatt - Fr 17.01.20 10:44

user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:
NUR: "write(x)" ist viel einfacher als "write(floattostrf(x,fffixed, 8,3,Formatsettings))". Deshalb meine Frage, ob man nicht pauschal das Format für write umstellen kann.

Kapsel den Teil floattostrf(x,fffixed, 8,3,Formatsettings) in einer eigenen lokalen Function. Dann wird es kürzer (z.B. write(MyFormatFloat(x)) und wenn Du das Format doch mal ändern willst, musst Du es nur an einer Stelle ändern.


GuaAck - Fr 17.01.20 12:25

Danke für die beiden letzten Hinweise. FormatFloat kannte ich noch nicht, ist wirklich übersichtlicher (und geht auch in Delphi 7, habe ich eben probiert.)

Kapseln wird wohl die beste Lösung sein,

viele Grüße
GuaAck