Moduły » SysUtils

Format

Format
Moduł: SysUtils

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;

Funkcja Format umożliwia sformatowanie łańcucha na podstawie parametrów przekazanych w 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 rzeczywista, przeważnie typ Integer,
  • u - nieokreślona liczba rzeczywista,
  • 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 części dziesiętnych,
  • 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ż: