Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   FormatFileSize (https://www.delphipraxis.net/197295-formatfilesize.html)

DieDolly 27. Jul 2018 17:24

AW: FormatFileSize
 
Es ist nun einmal Fakt, dass Windows eine falsche Speichergröße anzeigt.
Und nur weil sich jeder blind darauf verlässt, dass Windows es schon richtig macht und somit die Speichermengen MB statt MiB usw übernimmt, gibt es diese Verwirrung.

Ich weiß nicht genau welches Problem du hast. Aber du schreist in den Themen selber rum, dass die Leute die aktuell besprochene Thematik einzuhalten haben, schreibst hier aber selber irgendeinen Käse.

Aber wie oben erwähnt. Windows zeigt es seit Jahren falsch an, und jeder übernimmt es blind ohne darüber nachzudenken.

Uwe Raabe 27. Jul 2018 20:42

AW: FormatFileSize
 
Zitat:

Zitat von MicMic (Beitrag 1408925)
Je nach dem wo der Code steht, muss man noch "Application.UpdateFormatSettings := false;" setzen, da sonst bei "WM_WININICHANGE" oder "RM_TaskbarCreated" die FormatSettings wieder überschrieben werden (hier im Forum in einem Thread gelesen). Nur mal so als Info.

Das hast du aber nur gelesen, nicht probiert, oder? Das gilt nämlich nur für die globale Instanz FormatSettings, aber nicht für deine selbst erzeugte fs.

MicMic 28. Jul 2018 07:53

AW: FormatFileSize
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1408934)
Zitat:

Zitat von MicMic (Beitrag 1408925)
Je nach dem wo der Code steht, muss man noch "Application.UpdateFormatSettings := false;" setzen, da sonst bei "WM_WININICHANGE" oder "RM_TaskbarCreated" die FormatSettings wieder überschrieben werden (hier im Forum in einem Thread gelesen). Nur mal so als Info.

Das hast du aber nur gelesen, nicht probiert, oder? Das gilt nämlich nur für die globale Instanz FormatSettings, aber nicht für deine selbst erzeugte fs.


Ja, nur gelesen :) Dachte es wäre wichtig, deshalb wollt ich das hier dazuschreiben.
Aber Danke für die Info.
Ich habe jetzt folgendes, da man ja nicht aufrunden soll.
Code:
fs := TFormatSettings.Create;
fs.DecimalSeparator := ',';
_size := 23.203;
result := floattostr(_size);
kp := Pos(',',result);
if kp > 0 then result := copy(result,0,kp+2);
if result[length(result)]='0' then result := copy(result,0,length(result)-1);
result := result + ' '+s;
Ich schneide jetzt einfach ab auf 2 Stellen nach dem Komma und sollte dann zufällig noch eine "0" am Ende sein (beim ersten Copy z.B. aus 232,20343 = 232,20) wird diese "0" dann auch mit dem zweiten Copy entfernt. Beim ersten Copy "kp+2" gibt's keine Probleme wenn der Wert z.B. "232,2" beträgt. Da nimmt er wohl nur +1 weil es mehr nicht gibt. Am Ende füge ich dann noch die Bezeichnung ein "KB, KiB etc."

Edit:
Muss doch den 3 Zeiler nehmem, sprich 2x auf 0 prüfen. Der Wert kann ja z.B. auch "232,0034383" sein
Also doch so:
Code:
if Result[Length(Result)]='0' then result := Copy(Result,0,Length(Result)-1);
if Result[Length(Result)]='0' then result := Copy(Result,0,Length(Result)-1);
if Result[Length(Result)]=',' then result := Copy(Result,0,Length(Result)-1);
Michael

Schokohase 28. Jul 2018 08:13

AW: FormatFileSize
 
Da dieses Thema ja stark von der Oberlehrerfraktion besetzt ist:

Wenn man einen Wert rundet, dann werden nach Selbigem niemals die Nachkommastellen entfernt.
Code:
232,0034383 auf 2 Nachkommastellen gerundet: 232,00
Du kannst dir also diesen Zirkus sparen.

MicMic 28. Jul 2018 08:13

AW: FormatFileSize
 
Da der Wert auch 0 sein kann... Update:
Ohne "if Result <> '0' Then" würde es nämlich dann bei den Wert "0" ein Fehler verursachen.
Code:
fs := TFormatSettings.Create;
fs.DecimalSeparator := ',';
result := floattostr(_size);
kp := Pos(',',result);
if kp > 0 then result := copy(result,0,kp+2);
if Result <> '0' Then
Begin
  if Result[Length(Result)]='0' then result := Copy(Result,0,Length(Result)-1);
  if Result[Length(Result)]='0' then result := Copy(Result,0,Length(Result)-1);
  if Result[Length(Result)]=',' then result := Copy(Result,0,Length(Result)-1);
End;
result := result + ' '+s;
Michael

MicMic 28. Jul 2018 08:19

AW: FormatFileSize
 
Zitat:

Zitat von Schokohase (Beitrag 1408942)
Da dieses Thema ja stark von der Oberlehrerfraktion besetzt ist:

Wenn man einen Wert rundet, dann werden nach Selbigem niemals die Nachkommastellen entfernt.
Code:
232,0034383 auf 2 Nachkommastellen gerundet: 232,00
Du kannst dir also diesen Zirkus sparen.

Das Thema (bei mir *g) ist ja, da ich nicht weis wie ich mit Format/FormatFloat abrunden kann. Da wird ja aufgerundet und wie ich das jetzt verstanden habe, soll man bei einer Anzeige von Dateigrößen nicht aufrunden. Windows rundet ab, bei dem einem Beispielwert (weiter oben) 1,09. Format/FormatFloat macht 1,1 und der bekannte TotalCommander macht ne "1" (mit der Bezeichnung "M") raus. Ich mach den Zirkus ja nicht :) Wir alle :)

Michael

KodeZwerg 28. Jul 2018 09:54

AW: FormatFileSize
 
Zitat:

Zitat von MicMic (Beitrag 1408944)
da ich nicht weis wie ich abrunden kann

Na da kann Dir geholfen werden, mitSetRoundMode() ist so ein Verhalten steuerbar.

Uwe Raabe 28. Jul 2018 10:13

AW: FormatFileSize
 
Zitat:

Zitat von KodeZwerg (Beitrag 1408948)
Na da kann Dir geholfen werden, mitSetRoundMode() ist so ein Verhalten steuerbar.

Kannst du mal den Code zeigen, mit dem das funktioniert?

Ich würde das explizit ausprogrammieren:

Delphi-Quellcode:
 
  if <mit Punkt> then begin
    // sprachinvariant, immer mit Punkt
    fs := TFormatSettings.Invariant;
  end
  else begin
    // mit Komma oder was im Windows halt gerade eingestellt ist
    fs := FormatSettings;
  end;
  result := Format('%s %s', [FormatFloat('0.##', Floor(100*_size)/100, fs), s]);

KodeZwerg 28. Jul 2018 10:22

AW: FormatFileSize
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1408949)
Kannst du mal den Code zeigen, mit dem das funktioniert?

Ausführlicher Beispiel Code ist doch im Link? Vielleicht habe ich das was gefordert ist auch falsch Verstanden, wobei es bei auf/ab-runden nicht viel falsch zu verstehen gibt. Du meinst bestimmt seinen Code, ich meinte generell auf/abrunden.

MicMic 28. Jul 2018 10:36

AW: FormatFileSize
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1408949)
Zitat:

Zitat von KodeZwerg (Beitrag 1408948)
Na da kann Dir geholfen werden, mitSetRoundMode() ist so ein Verhalten steuerbar.

Kannst du mal den Code zeigen, mit dem das funktioniert?

Ich würde das explizit ausprogrammieren:

Delphi-Quellcode:
 
  if <mit Punkt> then begin
    // sprachinvariant, immer mit Punkt
    fs := TFormatSettings.Invariant;
  end
  else begin
    // mit Komma oder was im Windows halt gerade eingestellt ist
    fs := FormatSettings;
  end;
  result := Format('%s %s', [FormatFloat('0.##', Floor(100*_size)/100, fs), s]);

Jo, ist natürlich besser als mein Pos/Copy Zeugs :) Ich kenne natürlich Floor, wusste aber nicht wie ich es dort in der Zeile einsetze. Das nehme ich jetzt. Danke
Aber wegen diesen FormatSettings…

Wenn ich immer:
Code:
fs := TFormatSettings.Create;
fs.DecimalSeparator := ','; // oder '.' oder '/' (wie ich halt will)
nehme, bin ich auf der sicheren Seite mit meinem Komma oder Punkt. Oder?

Michael


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:17 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz