'Format' funktioniert nicht

Antworten
Justuv
Beiträge: 10
Registriert: So 1. Dez 2013, 11:41

'Format' funktioniert nicht

Beitrag von Justuv »

Hallo, was ist hier verkehrt?
var
Wert: Single;

Ich bin dabei eine Routine nach Linux zu übertragen. Unter Windows ist es kein Problem folgendes zu nutzen:
(var Wert: Single;)

Wert := StrToFloatDef(Edit.Text, 0);
an anderer Stelle dann:

String2 := Format('%1.2f',[Wert]);

Funktioniert tadellos unter Windows. Bei Linux jedoch erhalte ich als String2 einen Leerstring, aber auch keinerlei Fehlermeldung. Was bedeutet das? Ist da Linux irgend wie anders)

Jürgen

Benutzeravatar
photor
Beiträge: 443
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 2.2.6 FPC 3.2.2 (Gtk2)
CPU-Target: 64Bit

Re: 'Format' funktioniert nicht

Beitrag von photor »

Justuv hat geschrieben:
Mo 20. Feb 2023, 13:56
String2 := Format('%1.2f',[Wert]);
sieht komisch aus. Ich kann mich irren, aber sollte die erste Zahl im Format-String nicht größer als die zweite sein (weil die die Länge des ganzen Strings angibt? Also eher so

Code: Alles auswählen

String2 := Format('%12.2f',[Werte]);
Also so funktioniert es bei mir zumindest.

Ciao,
Photor

Justuv
Beiträge: 10
Registriert: So 1. Dez 2013, 11:41

Re: 'Format' funktioniert nicht

Beitrag von Justuv »

photor hat geschrieben:
Mo 20. Feb 2023, 15:37
Justuv hat geschrieben:
Mo 20. Feb 2023, 13:56
String2 := Format('%1.2f',[Wert]);
sieht komisch aus. Ich kann mich irren, aber sollte die erste Zahl im Format-String nicht größer als die zweite sein (weil die die Länge des ganzen Strings angibt? Also eher so

Code: Alles auswählen

String2 := Format('%12.2f',[Werte]);
Also so funktioniert es bei mir zumindest.

Danke, aber ich habe weiter geforscht und bin darauf gestoßen das es bei Eingaben mit(!) Komma nicht funktioniert.
Also 100 funktioniert, aber 100,50 funktioniert nicht. Da es sich hier um Geldbeträge handelt wäre das Komma nicht nur richtig sondern auch so gewünscht bei der Eingabe.
Aber: 100.50 das funktioniert! Wenn ich also den String zerlege, das Komma durch den Punkt ersetze, klappt dann auch das 'Format'. Bei einer späteren Ausgabe dann wieder Punkt durch Komma ersetzt, dann alles ok.
Aber muss der Aufwand denn wirklich so sein?

Jürgen
Übrigens, die 1. Angabe im Format-String bestimmt die Mindestlänge. Also mindestens so lang wie angegeben, oder halt länger aber nicht kleiner. . .

dj_leinad
Beiträge: 33
Registriert: Sa 1. Okt 2022, 05:27
OS, Lazarus, FPC: Win10 pro (Laz 3.2 / FPC 3.2.2)
CPU-Target: Win 64Bit
Wohnort: CH

Re: 'Format' funktioniert nicht

Beitrag von dj_leinad »

Hallo Justuv

Lass Dir mal den DefaultFormatSettings.DecimalSeparator in Windows und Linux anzeigen. Wichtig kann bei Zahlen da dann auch noch der DefaultFormatSettings.ThousandSeparator werden. Am besten diese zwei Werte mal in einem Label anzeigen lassen.
Erfahrung heißt gar nichts. Man kann eine Sache auch 35 Jahre schlecht machen.

Justuv
Beiträge: 10
Registriert: So 1. Dez 2013, 11:41

Re: 'Format' funktioniert nicht

Beitrag von Justuv »

dj_leinad hat geschrieben:
Mo 20. Feb 2023, 19:17
Hallo Justuv

Lass Dir mal den DefaultFormatSettings.DecimalSeparator in Windows und Linux anzeigen. Wichtig kann bei Zahlen da dann auch noch der DefaultFormatSettings.ThousandSeparator werden. Am besten diese zwei Werte mal in einem Label anzeigen lassen.
Danke, der Hinweis war der Richtige. Geholfen hat nun das Einbinden von 'Clocale'.

Gruß Jürgen

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

Re: 'Format' funktioniert nicht

Beitrag von wp_xyz »

Justuv hat geschrieben:
Mo 20. Feb 2023, 16:17
die 1. Angabe im Format-String bestimmt die Mindestlänge. Also mindestens so lang wie angegeben, oder halt länger aber nicht kleiner. . .
Zur Klarstellung: Die erste Zahl in z.B. '%15.3f' ist die gesamte Mindestlänge des Ergebnisstrings, die zweite die Anzahl der Dezimalstellen. In dem Beispiel '%15.3f' werden z.B. bei der Zahl 1.2 von dem 15 erlaubten Zeichen drei für die Dezimalstellen und eine für den Dezimaltrenner benötigt; es bleiben 11 freie Zeichen, die vor dem eigentlichen String mit Leerzeichen gefüllt werden, so dass der Text rechtsbündig formatiert wird. Das mag für eine Konsolen-Ausgabe mit einer Schriftart fester Zeichenbreite sinnvoll sein, bewirkt aber auf Formularen mit Proportionalschriftarten und - per Default - linksbündiger Ausgabe ein sehr unruhiges Erscheinungsbild (weil alle Zeichen unterschiedlich breit sind). Daher ist es sinnvoll, in der Regel die erste Zahl in der Formatangabe auf 0 zu setzen ('%0.3f') oder gleich ganz wegzulassen ('%.3f'). Damit werden keine Leerzeichen vorangestellt.

Antworten