AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FormatFileSize

Ein Thema von MicMic · begonnen am 27. Jul 2018 · letzter Beitrag vom 29. Jul 2018
Antwort Antwort
Seite 1 von 2  1 2      
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

AW: FormatFileSize

  Alt 27. Jul 2018, 15:13
Wer rundet jetzt falsch? Windows oder die Funktion?

Eine Datei mit 1148928 Bytes

1148928 / 1024 / 1024 = 1,0957031

Also eigentlich aufrunden. Das macht die Funktion. Also sie gibt 1,1 MiB zurück.

Windows 10 spuckt aber 1.09 raus (mit der Angabe MB. So wie ich das verstanden habe sollte ja hier dann "MiB" stehen)

Alles mal wieder durcheinander

Michael
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#2

AW: FormatFileSize

  Alt 27. Jul 2018, 15:23
Mit Format geht das wohl nicht, wohl aber mit FormatFloat:

result := Format('%s %s' [FormatFloat('0.##', _size, TFormatSettings.Invariant), s]);
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: FormatFileSize

  Alt 27. Jul 2018, 16:16
Mit Format geht das wohl nicht, wohl aber mit FormatFloat:

result := Format('%s %s' [FormatFloat('0.##', _size, TFormatSettings.Invariant), s]);
Super. Danke. Nach '%s %s' musste ich noch ein Komma einfügen. Nun habe ich versucht den Punkt wieder als Komma zu ändern. Ich will beides nutzen. Ein "0,##" geht hier nicht Habe gelesen, dass man bei den TFormatSettings etwas machen muss, sprich dieses "DecimalSeparator" dafür zuständig ist. Dieses "TFormatSettings.Invariant" soll Standard sein. Muss ich dann ein "TFormatSettings.Create" usw. machen? Aber was ist Standard (TFormatSettings.Invariant)? Ist es nicht eine Windows-Einstellung? Wenn ja, dann ist dies wohl nicht sicher, dass der Punkt ausgegeben wird. Irgendwo kann man in Windows ja diese Dinge abändern (auch für ein Datum usw.). Halt ne Benutzereinstellung.

Und Format rundet ja den Wert auf. Wie ich oben geschrieben habe, macht Windows wieder ne andere Rundung. Jeder kocht irgendwie sein eigenes Süppchen, sprich ich brauch wieder 2 Versionen, damit der Benutzer entscheiden kann. Den Befehl "Format" dazu bewegen, abzurunden... das ist bestimmt auch eine "TFormatSettings" Einstellung?

Michael
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#4

AW: FormatFileSize

  Alt 27. Jul 2018, 16:33
Wer rundet jetzt falsch? Windows oder die Funktion?

Eine Datei mit 1148928 Bytes

1148928 / 1024 / 1024 = 1,0957031

Also eigentlich aufrunden. Das macht die Funktion. Also sie gibt 1,1 MiB zurück.

Windows 10 spuckt aber 1.09 raus (mit der Angabe MB. So wie ich das verstanden habe sollte ja hier dann "MiB" stehen)

Alles mal wieder durcheinander

Michael
MiB ist richtig, MB ist falsch.
1148928 Bytes sind ungerundet 1,09 MiB. Gerundet 1,1 MiB.
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: FormatFileSize

  Alt 27. Jul 2018, 17:10
Ich hab jetzt:
Code:
fs := TFormatSettings.Create;
fs.DecimalSeparator := '.';
result := Format('%s %s', [FormatFloat('0.##', _size, fs), s]);
.free brauch ich ja hier nicht (verwirrt mich immer). So habe ich den "Punkt" und wenn ich ein Komma haben möchte mach ich dann natürlich "fs.DecimalSeparator := ',';".
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.

Jetzt fragt sich nur noch wie ich dem "Format" beibringen kann, ob er auf/abrunden soll. Es wird ja aufgerundet.

Zitat:
MiB ist richtig, MB ist falsch.
1148928 Bytes sind ungerundet 1,09 MiB. Gerundet 1,1 MiB.
1,0957031 = 1,09 (kann man jetzt als abrunden oder abschneiden sehen). Also sollte man in diesen Fällen (Anzeige von Dateigrößen) dann nicht aufrunden? Also wie Windows es machen?

Michael

P.s. Der Total-Commander gibt beispielsweise "1,0 M" zurück. Jeder macht's anders. Da weiß man gar nicht, welcher Weg der richtige ist.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#6

AW: FormatFileSize

  Alt 27. Jul 2018, 17:14
Ich denke am besten ist es, wenn man nicht rundet und nach der, sagen wir mal zweiten Stelle, alles abschneidet.
Ich gucke da gerne auf Linux. Die zeigen MB (nicht MiB) richtig an. Die nehmen das also etwas ernster.

Hier mal ein Beispiel.
https://www.thinkbroadband.com/download
Da kann man Testdateien runterladen. Die 5 MB große Datei sind in Wirklichkeit 5,2 MB.
Was Windows falsch anzeigt, übernehmen also auch Webseitenbetreiber blind.

Daher mein Rat, sich das mal unter Linux anzusehen. Dort wird's richtig gemacht.

Geändert von DieDolly (27. Jul 2018 um 17:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

AW: FormatFileSize

  Alt 27. Jul 2018, 17:18
Verwirrt es dich auch nach dem Duschen den Hahn zu zu drehen und die benutze Wäsche in den Wäschekorb zu werfen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#8

AW: FormatFileSize

  Alt 27. Jul 2018, 17:24
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#9

AW: FormatFileSize

  Alt 27. Jul 2018, 20:42
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#10

AW: FormatFileSize

  Alt 28. Jul 2018, 07:53
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

Geändert von MicMic (28. Jul 2018 um 07:57 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 Uhr.
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