Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Byte --> Kb/Mb/Gb (https://www.delphipraxis.net/176046-byte-kb-mb-gb.html)

ByTheTime 8. Aug 2013 16:22

Byte --> Kb/Mb/Gb
 
Hallo,
ich benutze folgende Routine um Byte(s) in eine für den Anwender schönere Darstellung umzuwandeln:

Delphi-Quellcode:
function FormatByteSize(const bytes: Longint): string;
const
  B = 1; // byte
  KB = 1024 * B; // kilobyte
  MB = 1024 * KB; // megabyte
  GB = 1024 * MB; // gigabyte
begin
  if bytes > GB then
    result := FormatFloat('#.## GB', bytes / GB)
  else if bytes > MB then
    result := FormatFloat('#.## MB', bytes / MB)
  else if bytes > KB then
    result := FormatFloat('#.## KB', bytes / KB)
  else
    result := FormatFloat('#.## bytes', bytes);
end;
Ich rechne die Dateigröße mehrerer Dateien zusammen und erhalte "143866884245" Byte. Das sind ~134GB. Allerdings erhalte ich mit der oben aufgeführten Routine 1,99GB.

Ich weiß nich was da schief geht.

Gruß,
Lukas

Bernhard Geyer 8. Aug 2013 16:29

AW: Byte --> Kb/Mb/Gb
 
LongInt ist nur 4 Byte groß.
Du brauchst für so große Zahlen Int64.

Der schöne Günther 8. Aug 2013 17:00

AW: Byte --> Kb/Mb/Gb
 
Wenn du die '143866884245' manuell einsetzt sieht man eigentlich schon zur Kompilierzeit die entsprechende Warnung :wink:

bernhard_LA 8. Aug 2013 18:54

AW: Byte --> Kb/Mb/Gb
 
oder hier http://www.delphipraxis.net/175158-a...ml#post1217345

ByTheTime 8. Aug 2013 22:14

AW: Byte --> Kb/Mb/Gb
 
Tatsächlich aus LongInt Int64 gemacht und es ging :o Danke Bernhard
@Günther: Ja, das habe ich jetzt gesehen danke für den Tipp. Hätte ich mal ausprobieren sollen...

Aber jetzt geht ja alles, danke für die Hilfe :)

Medium 9. Aug 2013 00:51

AW: Byte --> Kb/Mb/Gb
 
Am Rande, und auch etwas entgegen meines Sprachempfindens:
Byte*10^(3m) = [X]Byte
Byte*2^(10m) = [xbi]Byte
[m := "Magnitudentripel" (SI-Präfix-Schritt)]

also:
byte*1000 = kiloByte (kB)
byte*1024 = kibiByte (kiB)
byte*1000*1000 = MegaByte (MB)
byte*1024*1024 = MebiByte (MiB)
usw.

So ist es quasi-genormt. Ich finde den Wortklang der x-bis grauselig, und ganz durchgesetzt hat sich das bis Dato auch nicht, aber technisch korrekter wäre es.
Quasi, weil es imho von nahezu allen Standardisierungsorganisationen so anerkannt wird, aber eine formelle Norm gibt es glaube ich nicht.

jaenicke 9. Aug 2013 05:30

AW: Byte --> Kb/Mb/Gb
 
Also ich mache das einfach so...
Delphi-Quellcode:
function FormatDiskSpaceSize(const ASize: Int64): string;
const
  cBinaryPrefixes: array[0..8] of String = ('', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi');
var
  LogValue: Integer;
begin
  LogValue := Floor(Math.LogN(1024, ASize));
  Result := FloatToStrF(ASize / Math.Power(1024, LogValue), ffFixed, 12, 2) + ' ' + cBinaryPrefixes[LogValue] + 'B';
end;
// EDIT:
Zitat:

Zitat von Medium (Beitrag 1224086)
Quasi, weil es imho von nahezu allen Standardisierungsorganisationen so anerkannt wird, aber eine formelle Norm gibt es glaube ich nicht.

Doch gibt es:
IEC 80000-13:2008

Furtbichler 9. Aug 2013 06:28

AW: Byte --> Kb/Mb/Gb
 
Nehmt doch einfach die Kilo, Mega... Schreibweise. Die kennt jeder, es gibt keinen Lingualkrebs und hübscher ist es auch (weil die Zahlen auch größer sind). Oder kommt dann etwas anderes heraus, als z.B. beim Explorer?

p80286 9. Aug 2013 09:52

AW: Byte --> Kb/Mb/Gb
 
Meiner Meinung nach hat ein Kilobyte immer noch 1024 Bytes aber sei's drum Wikipedia erklärt's ohne Meinungsmache.

Gruß
K-H

jaenicke 9. Aug 2013 11:22

AW: Byte --> Kb/Mb/Gb
 
Zitat:

Zitat von p80286 (Beitrag 1224112)
Meiner Meinung nach hat ein Kilobyte immer noch 1024 Bytes

Ich unterscheide, wenn ich etwas schreibe, ob ich z.B. schreibe KB oder KiB. Bei Festplatten schreibe ich, dass sie 1 TB groß ist, aber wenn es um die Daten geht, passen etwa 0,9 TiB drauf.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:28 Uhr.

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