Autor Beitrag
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Do 16.01.20 00:05 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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.

_________________
We are, we were and will not be.
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Do 16.01.20 11:33 
Diese globale Variable sollte man nicht mehr verwenden. Besser so:
ausblenden 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 !

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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 ...

_________________
We are, we were and will not be.
GuaAck Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: 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.

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
GuaAck Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: 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