Format

Adam Boduch
Format
Moduł: SysUtils
```delphi function Format(const Format: string; const Args: array of const): string; overload; function Format(const Format: string; const Args: array of const; const FormatSettings: TFormatSettings): string; overload; ``` [[Delphi/Funkcje|Funkcja]] `Format` umożliwia sformatowanie łańcucha na podstawie parametrów przekazanych w [[Delphi/Tablice|tablicy]] Args. Funkcja formatuje łańcuch na podstawie parametru Format, który musi zawierać wzorzec - np.:
S := Format('Witaj %s, nazywam się %s', ['Nieznajomy', 'Komputer']);

Pierwszy parametr tej funkcji jest wzorcem. W miejsce oznaczone %s podstawione zostaną wartości przekazane w drugim parametrze, czyli wartość zmiennej S będzie następująca: Witaj Nieznajomy, nazywam się Komputer. Symbol %s oznacza, iż w to miejsce podstawiony zostanie parametr typu String. Jeżeli chcemy podstawić inne typy danych, należy użyć innego symbolu:

  • d - liczba całkowita, przeważnie typ Integer,
  • u - liczba naturalna (bez znaku),
  • e - wartość zmiennoprzecinkowa, rezultat w postaci formatu "naukowego",
  • f - wartość zmiennoprzecinkowa, rezultat w postaci liczby zaokrąglonej do dwóch miejsc po przecinku,
  • g - wartość zmiennoprzecinkowa,
  • n - numer, rezultat w postaci liczby z separatorem tysięcznym,
  • m - wartość pieniężna,
  • p - wskaźnik, adres do pamięci,
  • s - łańcuch,
  • x - wartość heksadecymalna.

Przykładowy program:

program Foo;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  S : String;
  TF : TextFile;
begin
  S := 'Hello World';

  AssignFile(TF, 'C:\foo.txt');
  Rewrite(TF);

  Writeln(TF, Format('String:      %s', [S]));
  Writeln(TF, Format('Decimal:     %d', [1024]));
  Writeln(TF, Format('Unsigned:    %u', [1024]));
  Writeln(TF, Format('Scientific:  %e', [1024.1024]));
  Writeln(TF, Format('Fixed:       %f', [1024.1024]));
  Writeln(TF, Format('General:     %g', [1024.1024]));
  Writeln(TF, Format('Number:      %n', [1024.1024]));
  Writeln(TF, Format('Money:       %m', [1024.1024]));
  Writeln(TF, Format('Pointer:     %p', [@S]));
  Writeln(TF, Format('Hexadecimal: %x', [1024]));

  CloseFile(TF);

  Readln;
end.

W skutek uruchomienia takiego programu, plik tekstowy zostanie zmodyfikowany następująco:

String:      Hello World
Decimal:     1024
Unsigned:    1024
Scientific:  1.02410240000000E+003
Fixed:       1024.10
General:     1024.1024
Number:      1 024.10
Money:       1 024.10 zł
Pointer:     0040A79C
Hexadecimal: 400

Zamiast funkcji Format, do wstawiania danych w łańcuchu można użyć funkcji konwersji danych, np. IntToStr oraz podobnych. Jednak w przypadku gdy mamy musimy wstawić wiele danych, zastosowanie funkcji Format zwiększa czytelność, a ponadto daje większe możliwości manipulowania formatowaniem.

Funkcja Format umożliwia określenie kilku dodatkowych parametrów, które należy nadać pomiędzy znakiem %, a symbolem określającym typ danych (czyli np. s, d). Istnieje np. możliwość nadania szerokości dla wartości:

S := Format('|%5d|', [12]);

Znaki | są użyte jedynie po to, aby zaakcentować początek oraz koniec łańcucha. Najważniejsze jest formatowanie: %5d, które spowoduje, iż zmienna S będzie posiadała wartość: | 12|. Dodatkowo, operator - daje możliwość wyrównania wartości do lewej:

{ rezultat: |   12| }
S := Format('|%5d|', [12]);
{ rezultat: |12   | }
S := Format('|%-5d|', [12]);

W takim wypadku minimalna szerokość wstawianej liczby to 5 znaków. Istnieje możliwość wypełnienia pustej przestrzeni, zerami:

{ rezultat: |00012| }
S := Format('|%.5d|', [12]);

Istnieje możliwość zastosowania kombinacji:

{ rezultat: |     00012| } 
S := Format('|%10.5d|', [12]);

Bardzo istostny operator, a mianowicie znak * umożliwia dynamiczne podstawienie wartości. W powyższym przykładzie szerokość określona jest liczbą 10, a precyzja do 5 cyfr. Być może będziesz zmuszony, aby to użytkownik zadecydował o precyzji. W takim wypadku można zastosować operator *:

program Foo;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  Width, Precision : Integer;
  S : String;
begin
  Width := 10;
  Precision := 5;

  S := Format('|%*.*d|', [Width, Precision, 12]);

  Writeln(S);

  Readln;
end.

Istnieje jeszcze jeden operator, znak dwukropka (:). Umożliwia określenie numeru argumentu, który zostanie wstawiony w dane miejsce. Przykładowo:

S := Format('|Test: %s %s %s %1:s|', ['Jeden', 'Dwa', 'Trzy']);
{ Rezultat: |Test Jeden Dwa Trzy Dwa| } 

Druga, przeciążona funkcja posiada parametr typu TFormatSettings, który może zawierać informacje o separatorze liczb dziesiętnych i innych związanych z daną lokalizacją.

Zobacz też:

0 komentarzy