Formatierter String

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Formatierter String

Beitrag von Joachim Raap »

Hallo, ich bekomme es nicht hin, eine in einem String enthaltene Zahl (kommt aus einer Datenbank) formartiert in einer ListView auszugeben. Eine gefundene mögliche Lösung "Output:=Format('%10.4f',[123.123456]); (Output: string)" funktioniert nur dann, wenn die Zahl direkt als Argument vorhanden ist. Wird sie durch eine Variable ersetzt, gibt es Fehlermeldungen. Kann jemand helfen?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5739
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Formatierter String

Beitrag von af0815 »

In einem STring enthaltene Zahl ist und bleibt ein String. Das ist mal so. Du kannst den String zuerst in eine Zahl konvertieren, dann muss du aber die Formate beachten. Dann Kannst du die Zahl formatiert zurück in einen String wandeln.

ENtweder ich speichere in der DB einen String oder eine Zahl. Bei so Sonderfällen, ist es halt der harte Weg, ausser du wandelst schon in der DB um. Super wird es, wenn dann mal mit Punkt, mal mit Komma als Dezimalseperator als String gespeichert wird. Dann gibt es die VielleichtDieOderDie Umwandlung.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: Formatierter String

Beitrag von Joachim Raap »

Punkt und Komma habe ich schon gelöst af0815....
Wie funktioniert die Umwandlung in der DB; im Moment sind die da als Decimal(10,2) vorhanden? Dann brauche ich doch da sicher auch ein zusätzliches Feld...

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5739
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Formatierter String

Beitrag von af0815 »

Joachim Raap hat geschrieben:
Di 22. Nov 2022, 20:52
Wie funktioniert die Umwandlung in der DB; im Moment sind die da als Decimal(10,2) vorhanden? Dann brauche ich doch da sicher auch ein zusätzliches Feld...
Bekommst du das nicht als AsFloat aus der DB ? Mir ist schon klar das jeder ZahlenTyp so seine Probleme hat mit Werten die sicht nicht zu 100% abbilden lassen. Das hast du aber nach einer Zwangskonvertierung aus dem String aber auch.
Zuletzt geändert von af0815 am Di 22. Nov 2022, 21:10, insgesamt 1-mal geändert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: Formatierter String

Beitrag von Joachim Raap »

nö - bislang "asstring" (nicht hauen.....) :oops:

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5739
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Formatierter String

Beitrag von af0815 »

Joachim Raap hat geschrieben:
Di 22. Nov 2022, 21:10
nö - bislang "asstring" (nicht hauen.....) :oops:
Keine weiteren Fragen Euer Ehren.

Versuche immer bei den Datentypen die passen zu bleiben. AsDatetime, AsFloat, AsInteger, AsString,...
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: Formatierter String

Beitrag von Joachim Raap »

funktioniert trotzdem nicht.
Jetzt mault die ListView rum, die bei SubItem.Add einen "Ansistring" erwartet und einen "Float" bekam,
Ich höre für heute auf und lese morgen im WWW weiter......

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5739
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Formatierter String

Beitrag von af0815 »

Joachim Raap hat geschrieben:
Di 22. Nov 2022, 21:21
funktioniert trotzdem nicht.
Jetzt mault die ListView rum, die bei SubItem.Add einen "Ansistring" erwartet und einen "Float" bekam,
Ich höre für heute auf und lese morgen im WWW weiter......
Dann passt es einmal. Du hast von der DB den richtigen Datentyp bekommen. Für die Darstellung für den Benutzer muss du den in die richtige Form bringen - und das ist hier ein String. Damit kannst du HIER dein Format anbringen, wo du den RealTypen gezielt mit Format so formatierest wie du es willst. Mit Format bist du schon auf dem richtigen Weg.

Visuelle Komponenten verlangen meist einen String Wert, das ist normal. Damit der Wert aber so beim Benutzer ankommt, solltest du auf der letzten Schnittstelle den für die Darstellung formatieren und nicht dazwischen andere Formate verwenden und das ganze fehlerträchtig unnötig konvertieren. Genaugenommen hätte der SQL Server zuerst den Zahlenwert in einen String verwandelt (mit seinen Einstellungen), den hättest du bei dir wieder zurückwandeln müssen, nur damit du den mit Format in das Format bekommst, das du für den Benutzer benötigst. dreifach Gemoppelt.

Klar beim Bedienen der Benutzerschnittstelle wird es Wandlungen geben, das sind auch die Bereiche wo es die meisten Probleme gibt. Aber intern solltest du die richtigen Formate komplett ohne Wandlung durchziehen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Formatierter String

Beitrag von wp_xyz »

Angenommen, dein Datenbank-Feld, das den Wert für die ListView liefert, heißt "Zahl" und ist ein Float-Feld, dann bekommst du mit "x := Dataset.FieldByName('Zahl').AsFloat" die im aktuellen Record enthaltene Zahl in die Variable x, wobei x z.B. ein Double ist. Und dieses x konvertierst du z.B. mit der Format-Anweisung in einen String "s := Format('%10.4f', [x])". Beachte, dass das x in eckigen Klammern stehen muss, weil hier ein Array von Argumenten übergeben wird, die in der Formatmaske jeweils nach einem % erwartet werden. '%10.4f' bedeutet, dass der zugehörige Parameter ein Gleitkommawert ist (also: single, double, oder extended, oder auch real aus alten Zeiten), die "4" gibt die Zahl der Nachkommastellen an, und die "10" direkt nach dem "%" bedeutet, dass die Ausgabe mindestens 10 Zeichen lang sein soll, falls der String kürzer wäre (fehlende Stellen werden dann links mit Leerzeichen aufgefüllt). Das mit der Mindestlänge stammt aus der Zeit der Fonts mit fester Zeichenbreite (Courier etc), denn damit konnte man Zahlen-Strings bequem rechts untereinander ausrichten. Heutzutage würde ich das nicht mehr verwenden, weil man normalerweise Fonts mit variabler Zeichenbreit hat und eine linksbündige Ausgabe damit sehr unruhig wird. Daher solltest du statt "%10.4f" besser "%0.4f", oder gleich "%.4f" schreiben.

Oder du verwendest für die Stringkonvertierung die etwas anschaulichere Methode mit FormatFloat: "s:= FormatFloat('0.0000', x)" (jetzt ohne eckige Klammer). Jede Null steht für eine auszufüllende Stelle (wobei vor dem Komma beliebig viele Stellen sein können). Das "0.0000" heißt also, dass du 4 Stellen hinter dem Komma willst, vor dem Komma sind beliebig viele, mindestens aber 1. Es gibt auch optionale Platzhalter '#', die nur dann aufgefüllt werden, wenn der zugehörige Stellenwert am String-Anfang oder -Ende nicht Null ist. Wenn x z.B. 10.5 ist würde FormatFloat('0.0000', x) die Ausgabe '10,5000' erzeugen, aber FormatFloat('0.0###', x) dagegen '10,5'. Und wenn vor dem '.' in der Maske ein Komma eingetragen ist, wird der ganzzahlige Anteil mit Tausender-Trennzeichen formatiert: FormatFloat(',0.00', 12345.123) = '12.345,123', viele schreiben die Maske in diesem Fall anschaulicher als '#,##0.00'. (Bei der Format-Anweisung muss man für die Tausendertrennzeichen das Symbol "n" statt "f" verwenden, also "%.4n')

Antworten