Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Trucos (https://www.clubdelphi.com/foros/forumdisplay.php?f=52)
-   -   Formatear tamaño de archivos (B, KB, MB, GB,TB, etc) (https://www.clubdelphi.com/foros/showthread.php?t=80437)

Lepe 08-06-2006 12:41:41

Formatear tamaño de archivos (B, KB, MB, GB,TB, etc)
 
Las rutinas sirven tanto para kilogramos, litros como KB. Se añade una rutina FormatFileSize por comodidad y aprendizaje de uso ;).

Código Delphi [-]
uses Windows, SysUtils, Classes, FileCtrl,shellapi,Forms,math; // algunos sobran ;)

type FileUnit = ( B=0, Kb, Mb, Gb, Tb, Auto);
var FileSizeUnit :array[FileUnit ] of string= ('B ', 'KB', 'MB', 'GB','TB', '');

// Lepe:
// formatea el tamaño de un archivo, el string es una de las variables
// declaradas arriba. Usar con jclFileUtils.GetSizeOfFile
function FormatFileSize(const Number:Int64;
                    const SelectedUnit:FileUnit=Auto):string;
// Lepe:
// formatea cualquier numero en base a unas unidades y el salto
// entre dichas unidades (UnitsDiff)
function FormatNumbers(const Number:Int64;
                       const BaseUnits:TStrings;
                       const UnitsDiff:Longint;
                       const SelectedUnit:Integer=0):string;

implementation
function FormatFileSize(const Number:Int64;
                       const SelectedUnit:FileUnit =Auto):string;
var units:TStringList;
    AutoUnit:FileUnit;
begin
  units:= TStringList.Create;
  try
    units.Add(FileSizeUnit[b]);
    units.Add(FileSizeUnit[Kb]);
    units.Add(FileSizeUnit[Mb]);
    units.Add(FileSizeUnit[gB]);
    units.Add(FileSizeUnit[Tb]);
    AutoUnit:= SelectedUnit;
    if AutoUnit=auto then
    while (AutoUnit > b) and (Number < Power(1024,Integer(AutoUnit)))do
      Dec(AutoUnit);
    Result:= formatnumbers(Number, units,1024,
              units.IndexOf(FileSizeUnit[AutoUnit]));
  finally
    units.Free;
  end;
end;



function FormatNumbers(const Number:Int64;
                       const BaseUnits:TStrings;
                       const UnitsDiff:Longint;
                       const SelectedUnit:Integer=0):string;
var Divisor:Extended;
    ComaPos, i, ThousandsSep:Integer;
    temp:string;
begin
   Result := IntToStr(Number);
  if Assigned(baseunits) then
  if (SelectedUnit <> 0) and (SelectedUnit <= BaseUnits.Count) then
  if (UnitsDiff <> 0) then
  begin
    Divisor := Power(UnitsDiff, Integer(SelectedUnit));
    Result := IntToStr(trunc(number / Divisor));

    temp := Floattostrf(frac(number / Divisor),ffNumber,3,2);
    Result:= Result + Copy(temp,pos(sysutils.DecimalSeparator,temp),3);

  end;
{------------------------------------------------------------------------------
 No podemos usar format para añadir los puntos de millar, ya que necesita
 un Float, que tiene menos precisión que un Int64
---------------añadimos puntos de millar y comas  ----------------------------}
  ThousandsSep:= 0;
  ComaPos:= Pos(Sysutils.DecimalSeparator,Result);
  if ComaPos = 0 then
    ComaPos := Length(Result)
  else
    Dec(ComaPos);
  for i:= ComaPos downto 2 do
  begin
    Inc(ThousandsSep);
    if (ThousandsSep mod 3 = 0)then
      Result:= Copy(Result,1,i-1)+
                    sysutils.ThousandSeparator+
                    Copy(Result,i,255);
  end;
{-----------------------------fin --------------------------------------------}

  if Assigned(baseunits) then
  if BaseUnits.Count > 0 then
  if (SelectedUnit < BaseUnits.Count) then
    Result := Result +' '+BaseUnits[selectedunit];
end;

Para llamar a la rutina:
Código Delphi [-]
var s:string;
begin
  s:= FormatFileSize(46546466546); // busca la unidad automáticamente

  s:= FormatFileSize(46546466546, MB); // resultado en la unidad indicada.
end;

Lepe 08-06-2006 12:41:42

En FormatFileSize, la línea:
Código Delphi [-]
    units.Add(FileSizeUnit);
Debe decir:
Código Delphi [-]
    units.Add(FileSizeUnit[ B]);

El sistema lo ha detectado como una "etiqueta de negrita" y se lo ha comido con patatas :D

PD: No sé editar el truco :D

Saludos

Emilio 08-06-2006 14:03:01

lepe, ya está solucionado, sin embargo puedes editar tus propios trucos haciendo clic en la imagen de un lapiz que aparece a la derecha en el listado de trucos.

Lepe 08-06-2006 14:32:04

Asias.


La franja horaria es GMT +2. Ahora son las 21:55:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi