Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
Delphi 12 Athens
|
Re: Grössenangabe automatische Umwandlung
23. Dez 2009, 12: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"
$2B or not $2B
|