unit ANBFormatString;
{$MODE Delphi}
{$codepage UTF8}
interface
uses StrUtils, SysUtils, VCLEx;
{stdcalls}
function FormatStr(const AFrmtdStr: String; const AArgs, AArgsValues: array of String): String; STDCALL;
function FormatStrW(const AFrmtdStr: WideString; const AArgs, AArgsValues: array of WideString): WideString; STDCALL;
implementation
function SearchAndReplaceStr(const AStr, ASearchStr, AReplaceStr: String): String;
var CurrDelim, NextDelim: IntEx;
    ElemName, s: String;
begin
s:= '';
CurrDelim:= 1;
repeat
 NextDelim:= PosEx(ASearchStr, AStr, CurrDelim);
 if NextDelim = 0 then
  NextDelim:= Length(AStr) + 1;
 ElemName:= Copy(AStr, CurrDelim, NextDelim - CurrDelim);
 if not (NextDelim > Length(AStr)) then
  s:= s + ElemName + AReplaceStr
  else
  s:= s + ElemName;
 CurrDelim:= NextDelim + Length(ASearchStr);
 until CurrDelim > Length(AStr);
Result:= s;
end;
{Only for Windows}
function SearchAndReplaceStrW(const AStr, ASearchStr, AReplaceStr: WideString): WideString;
var CurrDelim, NextDelim: IntEx;
    ElemName, s: WideString;
begin
s:= '';
CurrDelim:= 1;
repeat
 NextDelim:= PosEx(ASearchStr, AStr, CurrDelim);
 if NextDelim = 0 then
  NextDelim:= Length(AStr) + 1;
 ElemName:= Copy(AStr, CurrDelim, NextDelim - CurrDelim);
 if not (NextDelim > Length(AStr)) then
  s:= s + ElemName + AReplaceStr
  else
  s:= s + ElemName;
 CurrDelim:= NextDelim + Length(ASearchStr);
 until CurrDelim > Length(AStr);
Result:= s;
end;
function FormatStr(const AFrmtdStr: string; const AArgs, AArgsValues: array of String): String;
var i: IntEx;
    s: String;
begin
s:= AFrmtdStr;
if High(AArgs) <> High(AArgsValues) then
 raise Exception.Create('Array of arguments not equal array of its values!');
for i:= 0 to High(AArgs) do
 s:= SearchAndReplaceStr(s, AArgs[i], AArgsValues[i]);
Result:= s;
end;
{Only for Windows}
function FormatStrW(const AFrmtdStr: WideString; const AArgs, AArgsValues: array of WideString): WideString;
var i: IntEx;
    s: WideString;
begin
s:= AFrmtdStr;
if High(AArgs) <> High(AArgsValues) then
 raise Exception.Create('Array of arguments not equal array of its values!');
for i:= 0 to High(AArgs) do
 s:= SearchAndReplaceStrW(s, AArgs[i], AArgsValues[i]);
Result:= s;
end;
end.