Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Funktion (Größe formatieren) umkehren (https://www.delphipraxis.net/173466-funktion-groesse-formatieren-umkehren.html)

atc 26. Feb 2013 14:37

Delphi-Version: XE2

Funktion (Größe formatieren) umkehren
 
hallo,

ich versuche gerade eine umkehrfunktion zu dieser funktion zu schreiben:
Delphi-Quellcode:
function FormatSize(ASize: Int64): string;
const
  UNITS: Array[0..8] of string = ('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB',
                                  'ZB', 'YB');
var
  iIndex: Integer;
begin
  if ASize <= 0 then
    Result := '0,00 B'
  else
  begin
    iIndex := Trunc(ln(ASize) / ln(2) / 10);
    Result := Format('%f %s', [ASize / (1 shl (iIndex * 10)), UNITS[iIndex]]);
  end;
end;
FormatSize(5662353442) ergibt z.B. 5,27 GB

jetzt brauche ich eine funktion FormatSizeR, die beim Aufruf

FormatSizeR('5,27 GB') exakt den wert 5662353442 zurückliefert.

mein kläglicher ansatz sieht bisher so aus:
Delphi-Quellcode:
function FormatSizeR(S: string): Int64;
var
  I: Integer;
  E: Extended;
begin
  I := Pos(' ', S);
  Assert(I > 0);
  E := StrToFloat(Copy(S, 1, Pred(I)));
  S := Copy(S, Succ(I));
  if S = 'KB' then
    E := E * 1024
  else if S = 'MB' then
    E := E * 1024 * 1024
  else if S = 'GB' then
    E := E * 1024 * 1024 * 1024
  else if S = 'TB' then
    E := E * 1024 * 1024 * 1024 * 1024;
  Result := Trunc(E);
end;
allerdings ist das ziemlich umständlich und der wert stimmt auch nicht. kann man das mit ein wenig mathe nicht auch so elegant machen wie die andere funktion?

divBy0 26. Feb 2013 14:52

AW: Funktion (Größe formatieren) umkehren
 
Der Wert kann nicht stimmen, da ganz einfach Stellen fehlen.

Beispiel:
Code:
5662353442 / 1024 / 1024 / 1024 = 5,273477585986257 GB

5,273477585986257 * 1024 * 1024 * 1024 = 5662353442 Byte

5,27 * 1024 * 1024 * 1024 = 5658619413 Byte

atc 26. Feb 2013 14:55

AW: Funktion (Größe formatieren) umkehren
 
ok, hast recht. kann man denn den näherungswert (fehlende stellen einfach ignorieren) bestimmen ohne die vielen if-abfragen so wie in der ersten funktion?

Popov 26. Feb 2013 15:00

AW: Funktion (Größe formatieren) umkehren
 
Zitat:

Zitat von atc (Beitrag 1205137)
allerdings ist das ziemlich umständlich und der wert stimmt auch nicht.

Ich Grunde kann er auch nicht stimmen. Wenn ich 123,456789 auf 123,46 kürze, kann ich daraus höchstens wieder 123,460000 machen. Die Informationen hinter der dritten Kommastelle sind verloren. Genauso sieht es mit kB, MB und GB aus. Man kann es kürzen, aber nicht wiederherstellen. Selbst wenn du statt 1000 eben 1024 nimmst, auf den Byte genau kriegt man es nicht hin.

Edit:

Die If abfragen kann man sich sparen in dem man eine andere etwas kürzere Funktion nimmt (dessen Name mir gerade nicht einfällt). Aber viel kürzer wird es auch nicht. Und mit einer Funktion eher unwahrscheinlich.

divBy0 26. Feb 2013 15:01

AW: Funktion (Größe formatieren) umkehren
 
Wie soll das denn funktionieren?

Du musst ja schon auf die Einheit prüfen, sonst weißt du ja nicht mit was du multiplizieren musst.

Für was brauchst du denn diese Umkehrfunktion überhaupt? Dateigrößen usw. werden doch immer in Byte gespeichert.

p80286 26. Feb 2013 15:09

AW: Funktion (Größe formatieren) umkehren
 
Eine Möglichkeit währe es :
Delphi-Quellcode:
myconst='B KBMBTP....'

indx:=pos('xx',myconst);
Du mußt indx jetzt nur noch in die richtige 2er bzw 10er-Potenz übersetzen.
Ob das einfacher ist?

Gruß
K-H

Medium 26. Feb 2013 15:09

AW: Funktion (Größe formatieren) umkehren
 
Der ganze Ansatz scheint mir seltsam zu sein. Die Formatierung sollte wirklich und nur für die Anzeige benutzt werden. Intern sollte man den tatsächlichern Wert behalten.

divBy0 26. Feb 2013 15:10

AW: Funktion (Größe formatieren) umkehren
 
Zitat:

Zitat von p80286 (Beitrag 1205155)
Eine Möglichkeit währe es :
Delphi-Quellcode:
myconst='B KBMBTP....'
indx:=pos('xx',myconst);

Nette Idee! :thumb:

Popov 26. Feb 2013 15:15

AW: Funktion (Größe formatieren) umkehren
 
Übrigens, es gibt keine KB, und wenn, dann ist es falsch. Ich will nicht behaupten, dass es nicht vorkommt, aber man kann sich nicht drauf verlassen. Denn Kilo wird mit einem kleinem k abgekürzt. Somit schriebt man eigentlich kB. Zwar ist auch das keine offizielle Abkürzung, aber man sollte eben kB und KB erwarten. Bei MB und GB sieht das anders aus. m ist Aukürzung für Meter, somit wird ein mB nie vorkommen, genau wie auch gB, war Gramm Byte bedeuten würde. Großes K ist dagegen eine Abkürzung für Kelvin, womit KB Kelvin Byte bedeuten würde.

p80286 26. Feb 2013 15:17

AW: Funktion (Größe formatieren) umkehren
 
Zitat:

Zitat von divBy0 (Beitrag 1205159)
Zitat:

Zitat von p80286 (Beitrag 1205155)
Eine Möglichkeit währe es :
Delphi-Quellcode:
myconst='B KBMBTP....'
indx:=pos('xx',myconst);

Nette Idee! :thumb:

Danke,
aber ein Tippfehler und Du kannst es vergessen.

Gruß
K-H


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

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