Zahlenwerte sauber formatiert ausgeben

Für Fragen von Einsteigern und Programmieranfängern...
Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 331
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Zahlenwerte sauber formatiert ausgeben

Beitrag von Niesi »

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
Dateianhänge
Float2Str_Int2Str.png
Float2Str_Int2Str.png (20.9 KiB) 3480 mal betrachtet
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Epcop
Beiträge: 140
Registriert: Di 29. Mai 2012, 09:36

Re: Zahlenwerte sauber formatiert ausgeben

Beitrag von Epcop »


Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 331
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Zahlenwerte sauber formatiert ausgeben

Beitrag von Niesi »

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 ...

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Zahlenwerte sauber formatiert ausgeben

Beitrag von wp_xyz »

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)

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.

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 331
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Zahlenwerte sauber formatiert ausgeben

Beitrag von Niesi »

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 ...

Epcop
Beiträge: 140
Registriert: Di 29. Mai 2012, 09:36

Re: Zahlenwerte sauber formatiert ausgeben

Beitrag von Epcop »

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?

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Zahlenwerte sauber formatiert ausgeben

Beitrag von six1 »

@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!
Gruß, Michael

Socke
Lazarusforum e. V.
Beiträge: 3158
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

Beitrag von Socke »

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

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Zahlenwerte sauber formatiert ausgeben

Beitrag von wp_xyz »

Niesi hat geschrieben:
Mo 16. Mai 2022, 01:54
und mit Format steigt der Aufwand steil an ...
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.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Zahlenwerte sauber formatiert ausgeben

Beitrag von theo »

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. :wink:
Einen "messagecomposer" gibt es ja auch.

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 331
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Zahlenwerte sauber formatiert ausgeben

Beitrag von Niesi »

wp_xyz hat geschrieben:
Mo 16. Mai 2022, 10:13
Niesi hat geschrieben:
Mo 16. Mai 2022, 01:54
und mit Format steigt der Aufwand steil an ...
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').
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.

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 ...

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 331
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Zahlenwerte sauber formatiert ausgeben

Beitrag von Niesi »

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. :wink:
Einen "messagecomposer" gibt es ja auch.
Hi Theo,

bitte, was ist der "MessageComposer"?

Gruß Harald
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Zahlenwerte sauber formatiert ausgeben

Beitrag von theo »

Niesi hat geschrieben:
Di 17. Mai 2022, 02:54
bitte, was ist der "MessageComposer"?
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.

MessageComposer.png
MessageComposer.png (72.32 KiB) 3171 mal betrachtet

PascalDragon
Beiträge: 825
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

Beitrag von PascalDragon »

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 ...
Weil Str dafür gedacht ist eine bestimmte, vom Nutzer vorgegebene Minimallänge des Strings zurückzugeben, IntToStr und FloatToStr aber eben nicht.

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

Benutzeravatar
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

Beitrag von Winni »

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).
Hi!

Monotype Font verwenden und schon sind alle Zeichen gleich breit. Dann geht's auch mit str.

Winni

Antworten