Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#10

Re: Grössenangabe automatische Umwandlung

  Alt 23. Dez 2009, 11:58
OK, abgesehn von ein paar Denkfehlern und dem Verzählen bei den Arraygrößen ...

sollte es jetzt gehn und es sollte für jeden was dabei sein

Delphi-Quellcode:
Type TSTSFormat = (stsShort, stsLong, sts2, sts2Long, sts10, sts10Long, stsFull);

Function SizeToString(Const Size: Int64; SFormat: TSTSFormat; Const ErrorStr: String = ''): String;
  Const D: Array[Boolean, 0..16] of Int64 = ((1000, 10235, 102349, 1023488, 10480518, 104805172,
      1048051712, 10732049531, 107320495309, 1073204953088, 10989618719622, 109896187196212,
      1098961871962112, 11253369568892027, 112533695688920269, 1125336956889202688, 0), (1000,
      9995, 99950, 999500, 9995000, 99950000, 999500000, 9995000000, 99950000000, 999500000000,
      9995000000000, 99950000000000, 999500000000000, 9995000000000000, 99950000000000000,
      999500000000000000, 0));
    S: Array[sts2..sts10Long] of Array[0..6] of String = (('%.*n B', '%.*n KiB', '%.*n MiB',
      '%.*n GiB', '%.*n TiB', '%.*n PiB', '%.*n EiB'), ('%.*n Byte', '%.*n Kibibyte',
      '%.*n Mebibyte', '%.*n Gibibyte', '%.*n Tebibyte', '%.*n Pebibyte', '%.*n Exbibyte'), (
      '%.*n B', '%.*n KB', '%.*n MB', '%.*n GB', '%.*n TB', '%.*n PB', '%.*n EB'), ('%.*n Byte',
      '%.*n Kilobyte', '%.*n Megabyte', '%.*n Gigabyte', '%.*n Terabyte', '%.*n Petabyte',
      '%.*n Exabyte'));
    X: Array[Boolean, 0..6] of Int64 = ((1, 1024, 1048576, 1073741824, 1099511627776,
      1125899906842624, 1152921504606846976), (1, 1000, 1000000, 1000000000, 1000000000000,
      1000000000000000, 1000000000000000000));

  Var i: Integer;
    F: TSTSFormat;

  Begin
    If Size >= 0 Then Begin
      If SFormat < stsFull Then Begin
        i := 0;
        While (i < High(D[False])) and (Size >= D[SFormat >= sts10, i]) do Inc(i);
        Inc(i, 2);
        F := SFormat;
        If F < sts2 Then Inc(F, 4);
        Result := Format(S[F, i div 3], [2 - (i mod 3), Size / X[SFormat >= sts10, i div 3]]);
      End Else Result := Format(S[sts2Long, 0], [0, Size / 1]);
    End Else Result := Format(ErrorStr, [Size, Size / 1]);
  End;
Wie gesagt, es wird immer auf maximal 3 Stellen gerundet angezeigt.
(dieses funktioniert aber nur richtig, wenn der Standardrundungsmodus verwendet wird und bei den 1000er-Schritten muß ich mal sehn, ob es so auch noch stimmt)

Für ErrorStr kann man sonstewas angeben, welches genutzt wird, wenn der Wert negativ ist.
z.B.: "Fehler", "%d" oder "%1:.0f Byte"
Angehängte Dateien
Dateityp: zip project1_130.zip (2,2 KB, 17x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat