Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Форматирование строки с использованием подстановочных символов

01.01.2007
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Форматирование строки с использованием подстановочных символов %1, %2 и т.д.
 
Функция заменяет в строке Str все подстроки '%1', '%2', и т.д. На
соответсвующие значения из массива Values. При этом значения этого массива
не должны содержать подстановочных подстрок, в противном случае возможно
зависание функции.
 
Зависимости: SysUtils
Автор:       Dimka Maslov, mainbox@endimus.ru, ICQ:148442121, Санкт-Петербург
Copyright:   Dimka Maslov
Дата:        15 мая 2002 г.
***************************************************** }
 
{Эта функция работает неверно, если в строке, на которую надо
заменить %1,%2,… содержится одна из строк %1,%2,…
( она зависнет в бесконечном цикле )}
 
function FmtString(const Str: string; const Values: array of string): string;
 
 
function InternalPos(SubStr: string; Str: PChar; out P: Integer): Integer;
 
var
   
Ptr: PChar;
 
begin
   
Ptr := StrPos(Str, PChar(SubStr));
   
if Ptr = nil then
     
Result := -1
   
else
     
Result := Integer(Ptr) - Integer(Str);
    P
:= Result;
 
end;
 
 
function InternalReplace(const Str, OldSub, NewSub: string): string;
 
var
   
PrePos: Integer;
   
CurPos: Integer;
   
OldLen, NewLen: Integer;
 
begin
   
PrePos := 1;
   
Result := Str;
   
OldLen := Length(OldSub);
   
NewLen := Length(NewSub);
   
while InternalPos(OldSub, @Result[PrePos], CurPos) >= 0 do
   
begin
     
Inc(PrePos, CurPos);
     
Delete(Result, PrePos, OldLen);
     
Insert(NewSub, Result, PrePos);
     
Inc(PrePos, NewLen);
   
end;
 
end;
 
var
  i
: Integer;
begin
 
Result := Str;
 
for i := High(Values) downto Low(Values) do
   
Result := InternalReplace(Result, '%' + IntToStr(i + 1), Values[i]);
end;
Пример использования:
 
FmtString('%1 %2', ['Пример', 'использования']);