Kommastellen abschneiden

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
paffii
Beiträge: 17
Registriert: Do 4. Jun 2020, 23:24
OS, Lazarus, FPC: Mint 18.3 (L 2.0.6 FPC 3.0.4)
CPU-Target: 64Bit
Wohnort: Metzingen

Kommastellen abschneiden

Beitrag von paffii »

Hallo,

in Pascal gibt es die Funktion, Kommastellen einzustellen mit z.B. "variable:4:2"
Leider finde ich sowas nicht in Lazarus. Finde nur Hinweise zu Round, Trunc, etc..dabei möchte ich einfach nur abschneiden.

Ich habe

Code: Alles auswählen

verbrauch:=W*t*365/1000;
und

Code: Alles auswählen

 jahresverbrauch.text:=floattostr(verbrauch);
und möchte den jahresverbrauch mit nur 2 Stellen hinter dem Komma darstellen

danke..

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Kommastellen abschneiden

Beitrag von fliegermichl »

Code: Alles auswählen

jahresverbrauch.text := Format('%.2f', [verbrauch]);
Der Formatstring kann auch mehr Text enthalten. z.B.

Code: Alles auswählen

jahresverbrauch.text := Format('Der Jahresverbrauch beträgt %.2f Liter bei %d gefahrenen Kilometern.', [verbrauch, km]);
wobei die Parameter zu den Platzhaltern passen müssen. verbrauch muß also eine Fliesskommazahl (Single, Double, Extended etc.) und km eine ordinalvariable (Byte, Integer, Longint etc.) sein.

wennerer
Beiträge: 516
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Kommastellen abschneiden

Beitrag von wennerer »

Hallo,
eine weitere Möglichkeit ist der Befehl FloattoStrF.
Eine Beschreibung findest du hier:
https://www.freepascal.org/docs-html/rt ... ostrf.html
Und so könnte es aussehen:

Code: Alles auswählen

jahresverbrauch.text:=floattostrf(verbrauch,ffNumber,8,2);
Wenn du es in einem längeren Text einbetten willst geht das natürlich auch:

Code: Alles auswählen

Label1.Caption:='Mein Jahresverbrauch ist: '+floattostrf(verbrauch,ffNumber,8,2)+' Liter';
Da finde ich aber die Variante von Fliegermichl eleganter.

Viele Grüße
Bernd

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Kommastellen abschneiden

Beitrag von Mathias »

Oder man verwendet den alten Pascal Klassiker Str(...).
https://wiki.freepascal.org/Str/de
Wen man viele Zahlen umwandeln will, ist das die schnellste Variante.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

paffii
Beiträge: 17
Registriert: Do 4. Jun 2020, 23:24
OS, Lazarus, FPC: Mint 18.3 (L 2.0.6 FPC 3.0.4)
CPU-Target: 64Bit
Wohnort: Metzingen

Re: Kommastellen abschneiden

Beitrag von paffii »

Wow, was für eine tolle Hilfe hier :-)
Vielen Dank euch..

Andreas

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

Re: Kommastellen abschneiden

Beitrag von wp_xyz »

Man sollte vielleicht noch anfügen, dass die Routinen Format(), FloatToStrF() und das (noch nicht genannte) FormatFloat() die Ländereinstellungen des Betriebssystems verwenden, um Dezimalzahlen darzustellen. Dabei wird bei uns in Deutschland immer ein Komma verwendet. Wenn du lieber einen Dezimalpunkt willst, musst du die von Mathias genannte Str()-Prozedur nehmen (was aber meist eine Zwischen-Variable erfordert, weil es sich um eine Prozedur, keine Funktion handelt); oder du gibst in den erstgenannten Funktionen als letzten Parameter entsprechend abgeänderte FormatSettings an:

Code: Alles auswählen

var
  fs: TFormatSettings;
...
  fs := DefaultFormatSettings;
  fs.DecimalSeparator := '.';
  JahresVerbrauch.Text := Format('%.2f', [verbrauch], fs);
  //oder: Jahresverbrauch.Text := FloatToStrF(verbrauch, ffNumber, 8, 2, fs);
  // oder: Jahresverbrauch.Text := FormatFloat('0.00', verbrauch, fs);  
Zuletzt geändert von wp_xyz am So 7. Jun 2020, 14:34, insgesamt 1-mal geändert.

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Kommastellen abschneiden

Beitrag von Mathias »

musst du die von Mathias genannte Str()-Prozedur nehmen (was aber meist eine Zwischen-Variable erfordert, weil es sich um eine Prozedur, keine Funktion handelt);
Mit FloatToStrF wird intern auch nicht aus diese Variable verzichtet. Wen man tief in fpc reinguckt, wird schlussendlich auch Str() verwendet.
Und mit sehr viel Overhead.

Code: Alles auswählen

  If (P<>0) Then
    S[P] := '.';
  try
    Val(trim(S),Value,E);  
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Kommastellen abschneiden

Beitrag von wp_xyz »

Dem Anwender einer Float-zu-String-Konvertierungsroutine ist weitgehend egal, was intern alles passiert. Wichtig für ihn ist die Anwendung der Routine. Und da ist die Prozedur str() nunmal etwas unpraktischer als die Funktionen FloatToStrF/Format/FormatFloat, die das, wofür Str() drei Zeilen braucht, in einer einzigen Zeile erledigen können:

Code: Alles auswählen

// Anwendung von str():
var s: String;
  Str(verbrauch, s);
  JahresVerbrauch.Text := s;
  
// Anwendung von Format
  JahresVerbrauch.Text := Format('%.2f', [verbrauch]);

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Kommastellen abschneiden

Beitrag von Mathias »

Es kommt immer auf den Anwendungsfall an. Für ein EditFeld ist FloatToStr perfekt. Da es den Ländereinstellungen angepasst wird.
Will ich aber eine grosse OBJ oder SVG Datei konventieren, ziehe ich Str() und Val() vor.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: Kommastellen abschneiden

Beitrag von gladio »

Eventuell, wenn von Bedeutung, da er nur abschneiden will:
Mindestens FormatFloat rundet auch recht ordentlich kaufmännisch.
Die anderen Varianten habe ich noch nie genutzt.

Antworten