Zahlenwerte sauber formatiert ausgeben
- Niesi
- Lazarusforum e. V.
- Beiträge: 587
- Registriert: So 26. Jun 2016, 19:44
- OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
- Kontaktdaten:
Zahlenwerte sauber formatiert ausgeben
Hallo,
ich muss sehr viele Zahlenwerte aus Optimierungsberechnungen präsentieren, dabei handelt es sich um Integer- und Float-Werte, plus und minus. Das passiert in unterschiedlichster Form, es MUSS sauber aussehen und gut lesbar sein.
Mit FloatToStr oder IntToStr gelingt mir das aber nicht, weil das Minuszeichen nicht sauber formatiert wird.
Mit Str() hingegen klappt das ...
Mache ich was falsch?
Beste Grüße
Harald
ich muss sehr viele Zahlenwerte aus Optimierungsberechnungen präsentieren, dabei handelt es sich um Integer- und Float-Werte, plus und minus. Das passiert in unterschiedlichster Form, es MUSS sauber aussehen und gut lesbar sein.
Mit FloatToStr oder IntToStr gelingt mir das aber nicht, weil das Minuszeichen nicht sauber formatiert wird.
Mit Str() hingegen klappt das ...
Mache ich was falsch?
Beste Grüße
Harald
- Dateianhänge
-
- Float2Str_Int2Str.png (20.9 KiB) 4109 mal betrachtet
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...
- Niesi
- Lazarusforum e. V.
- Beiträge: 587
- Registriert: So 26. Jun 2016, 19:44
- OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
- Kontaktdaten:
Re: Zahlenwerte sauber formatiert ausgeben
Habe ich mir angesehen, finde ich umständlich - ich kann mit Str() leben, habe mir halt eigene Funktionen Int2Str und Float2Str gemacht - ich möchte gern verstehen, wieso das mit FloatToStr und IntToStr so blöd aussieht ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...
Re: Zahlenwerte sauber formatiert ausgeben
Was verstehst du unter "sauber"? Offenbar vor einer positiven Zahl den Platz für das Vorzeichen als Leerzeichen frei halten. Aber auch am Komma ausrichten? Steht für die Ausgabe ein Font mit fester Zeichenbreite zur Verfügung? Wenn nicht, ist die Ausrichtung am Komma, wenn's pixelgenau sein muss, sehr mühsam.
Hier ein paar Tests auf der Konsole mit Standard-Font (feste Zeichenbreite). In jedem Fall musst du rechnen, um das Ausgabeformat für Floats und Integer an der Einer-Stelle unabhängig von der Größenordnung der Zahl rechtsbündig auszurichten. Vielleicht gibt es noch ein paar Möglichkeiten, aber in meinem Test gibt es nur Str und Format, die die Ausgabebreite links mit Leerzeichen auffüllen (natürlich auch WriteLn, aber das spielt in einer Benutzeroberfläche keine Rolle)
Hier ein paar Tests auf der Konsole mit Standard-Font (feste Zeichenbreite). In jedem Fall musst du rechnen, um das Ausgabeformat für Floats und Integer an der Einer-Stelle unabhängig von der Größenordnung der Zahl rechtsbündig auszurichten. Vielleicht gibt es noch ein paar Möglichkeiten, aber in meinem Test gibt es nur Str und Format, die die Ausgabebreite links mit Leerzeichen auffüllen (natürlich auch WriteLn, aber das spielt in einer Benutzeroberfläche keine Rolle)
Code: Alles auswählen
program Project1;
uses
SysUtils;
const
x1 = 123456.123456789;
x2 = 1.234567789;
x3 = -1.23456;
i1 = 12;
i2 = 123456;
const
d = 3; // Dezimalstellen
w = 9; // Zahl der Digits (Leerzeichen) vor dem Komma
var
s: String;
begin
WriteLn('WriteLn (non-GUI!)');
WriteLn(x1:w+d+1:d);
WriteLn(x2:w+d+1:d);
WriteLn(x3:w+d+1:d);
WriteLn(i1:w);
WriteLn(i2:w);
WriteLn;
WriteLn('Str');
str(x1:w+d+1:d, s); WriteLn(s);
str(x2:w+d+1:d, s); WriteLn(s);
str(x3:w+d+1:d, s); WriteLn(s);
str(i1:w, s); WriteLn(s);
str(i2:w, s); WriteLn(s);
WriteLn;
WriteLn('Format');
WriteLn(Format('%*.*f', [w+d+1, d, x1]));
WriteLn(Format('%*.*f', [w+d+1, d, x2]));
WriteLn(Format('%*.*f', [w+d+1, d, x3]));
WriteLn(Format('%*d', [w, i1]));
WriteLn(Format('%*d', [w, i2]));
WriteLn;
WriteLn('FormatFloat');
WriteLn(FormatFloat('######.000', x3));
WriteLn(FormatFloat('#####0', i1));
WriteLn;
WriteLn('FloatToStrF');
WriteLn(FloatToStrF(x3, ffFixed, w+d+1, d));
WriteLn(FloatToStrF(i1, ffFixed, w, 0));
WriteLn(FloatToStrF(i1, ffFixed, w, 0));
ReadLn;
end.
Zuletzt geändert von wp_xyz am Mo 16. Mai 2022, 09:55, insgesamt 1-mal geändert.
- Niesi
- Lazarusforum e. V.
- Beiträge: 587
- Registriert: So 26. Jun 2016, 19:44
- OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
- Kontaktdaten:
Re: Zahlenwerte sauber formatiert ausgeben
Dankeschön, ... ich denke, eigene Funktionen mit Str() sind die einzig praktikablen Lösungen. FloatToStr und IntToStr gehen halt nicht ... und mit Format steigt der Aufwand steil an ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...
Re: Zahlenwerte sauber formatiert ausgeben
Wie sollen die Zahlen den aussehen? Oder was meinst du mit sauber aussehen (suchst du vielleicht nur die Schriftart "Courier" für die Zahlen)?
Kannst du ein Beispiel sagen?
Kannst du ein Beispiel sagen?
Re: Zahlenwerte sauber formatiert ausgeben
@Niesi
nimm FORMAT... es ist überschaubar sich da einzuarbeiten und du bekommst damit praktisch jede Formatierung hin.
Im INet findest du zahllose Beispiele dazu, dein Problem schnell zu lösen!
nimm FORMAT... es ist überschaubar sich da einzuarbeiten und du bekommst damit praktisch jede Formatierung hin.
Im INet findest du zahllose Beispiele dazu, dein Problem schnell zu lösen!
Gruß, Michael
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Zahlenwerte sauber formatiert ausgeben
Ich hab mir die Dokumentation zu Format in den Favoriten abgelegt. Damit kann ich schnell nachsehen. Die genaue Syntax kann ich mir bei seltener Verwendung auch nicht merken.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: Zahlenwerte sauber formatiert ausgeben
Bitte wo ist denn da der Aufwand?
- Die Maske für Floats ohne Tausendertrenner ist %f bzw %g, mit Trenner %n, Exponentialdarstellung %e, für Integer %d.
- Unmittelbar nach dem %-Zeichen kannst du die gewünschte Feldbreite eingeben, also z.B %10d für die Formatierung eines Integer, wobei 10 Zeichen reserviert werden und ggfs links mit Leerzeichen aufgefüllt werden, aber eine längere Zahl auch nicht abgeschnitten wird.
- Und bei einem Float kannst du vor dem "f", "g", "n", "e" auch noch die Zahl der Dezimalstellen angeben: %10.3f ergibt eine Zahlenstring mit 3 Kommastellen und reserviert dafür (inkl. Dezimalkomma und Dezimalstellen) 10 Zeichen.
- Die Konstanten 10 bzw. 3 in der Formatanweisung kann man auch durch '*' ersetzen und muss dann aber in der Parameterliste einen entsprechenden Wert vorsehen: Format('%*.*f', [10, 3, x]).
- Der Unterschied zwischen "f" (wie: "Festkomma") und "g" (wie: "Gleitkomma") ist, dass bei "g" Nullen am Ende nach dem Komma weggelassen werden (Format('%0.3g', [1.2]) --> '1.2', aber Format('%0.3f', [1.2]) --> '1.200').
Zuletzt geändert von wp_xyz am Mo 16. Mai 2022, 10:46, insgesamt 1-mal geändert.
Re: Zahlenwerte sauber formatiert ausgeben
Ich muss da auch immer nachschauen und benutze "Format" deshalb recht selten.
Da könnte man mal einen Composer oder Wizard für die IDE basteln.
Einen "messagecomposer" gibt es ja auch.
Da könnte man mal einen Composer oder Wizard für die IDE basteln.

Einen "messagecomposer" gibt es ja auch.
- Niesi
- Lazarusforum e. V.
- Beiträge: 587
- Registriert: So 26. Jun 2016, 19:44
- OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
- Kontaktdaten:
Re: Zahlenwerte sauber formatiert ausgeben
Ich programmiere mit Pascal, weil das eine sehr gut lesbare, sehr gut verständliche und logisch aufgebaute Programmiersprache ist. Zumindest fast immer. Format gehört nach meiner Meinung zu den sehr unglücklich gestalteten Funktionen. Und: mit Str erreiche ich mein Ziel, die Ergebnisse sauber anzuzeigen, auf eine sehr einfache, logisch nachvollziehbare Art und Weise.wp_xyz hat geschrieben: Mo 16. Mai 2022, 10:13Bitte wo ist denn da der Aufwand?
- Die Maske für Floats ohne Tausendertrenner ist %f bzw %g, mit Trenner %n, Exponentialdarstellung %e, für Integer %d.
- Unmittelbar nach dem %-Zeichen kannst du die gewünschte Feldbreite eingeben, also z.B %10d für die Formatierung eines Integer, wobei 10 Zeichen reserviert werden und ggfs links mit Leerzeichen aufgefüllt werden, aber eine längere Zahl auch nicht abgeschnitten wird.
- Und bei einem Float kannst du vor dem "f", "g", "n", "e" auch noch die Zahl der Dezimalstellen angeben: %10.3f ergibt eine Zahlenstring mit 3 Kommastellen und reserviert dafür (inkl. Dezimalkomma und Dezimalstellen) 10 Zeichen.
- Die Konstanten 10 bzw. 3 in der Formatanweisung kann man auch durch '*' ersetzen und muss dann aber in der Parameterliste einen entsprechenden Wert vorsehen: Format('%*.*f', [10, 3, x]).
- Der Unterschied zwischen "f" (wie: "Festkomma") und "g" (wie: "Gleitkomma") ist, dass bei "g" Nullen am Ende nach dem Komma weggelassen werden (Format('%0.3g', [1.2]) --> '1.2', aber Format('%0.3f', [1.2]) --> '1.200').
Ich würde gern verstehen, warum die Funktionen IntToStr und FloatToStr - trotz interner Verwendung von Str - das nicht bringen. Aber das ist wohl unklar ...
Jedenfalls Danke für die Antworten mit den Hinweisen und Vorschlägen!
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...
- Niesi
- Lazarusforum e. V.
- Beiträge: 587
- Registriert: So 26. Jun 2016, 19:44
- OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
- Kontaktdaten:
Re: Zahlenwerte sauber formatiert ausgeben
Hi Theo,theo hat geschrieben: Mo 16. Mai 2022, 10:26 Ich muss da auch immer nachschauen und benutze "Format" deshalb recht selten.
Da könnte man mal einen Composer oder Wizard für die IDE basteln.![]()
Einen "messagecomposer" gibt es ja auch.
bitte, was ist der "MessageComposer"?
Gruß Harald
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...
Re: Zahlenwerte sauber formatiert ausgeben
Eine Hilfswerkzeug um Dialoge zu erstellen, da diese auch kaum jemand "bedienen" kann ohne jedes Mal die Hilfe oder Google zu konsultieren.
Also eine Lösung innerhalb der IDE für ein ähnliches Grundproblem.
"messagecomposerpkg.lpk" ist bei Lazarus dabei, aber standardmässig nicht installiert.
-
- Beiträge: 958
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: Zahlenwerte sauber formatiert ausgeben
Weil Str dafür gedacht ist eine bestimmte, vom Nutzer vorgegebene Minimallänge des Strings zurückzugeben, IntToStr und FloatToStr aber eben nicht.Niesi hat geschrieben: Di 17. Mai 2022, 00:51 Ich würde gern verstehen, warum die Funktionen IntToStr und FloatToStr - trotz interner Verwendung von Str - das nicht bringen. Aber das ist wohl unklar ...
Str stammt aus der Zeit als Konsolenprogramme üblich waren. Es war also sinnvoll eine Funktion zu haben, die das mit der Länge mit übernimmt. IntToStr und FloatToStr stammen von Delphi, also aus der UI Zeit, wo der Gedanke ist, dass du eh sowas wie Textalignment verwenden wirst und noch dazu die Breite eines Leerzeichens nicht unbedingt mit der Breite eines Minus übereinstimmen muss (und damit die Ausrichtung eh wieder dahin wäre).
FPC Compiler Entwickler
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: Zahlenwerte sauber formatiert ausgeben
Hi!PascalDragon hat geschrieben: Di 17. Mai 2022, 09:22 .... und noch dazu die Breite eines Leerzeichens nicht unbedingt mit der Breite eines Minus übereinstimmen muss (und damit die Ausrichtung eh wieder dahin wäre).
Monotype Font verwenden und schon sind alle Zeichen gleich breit. Dann geht's auch mit str.
Winni