I suggest making it more safe:
function FormatFloat(const Format: string; Value: Extended; const FormatSettings: TFormatSettings): string;
procedure FormatCommon(Buf: PChar);
var
Len: SizeInt;
begin
Len := FloatToTextFmt(@Buf[0], Value, PChar(Format), FormatSettings);
SetString(Result, Buf, Len);
end;
procedure FormatDynamicBuf;
var
Buf: PChar;
begin
Buf := GetMem(Length(Format) + 100);
try
FormatCommon(Buf);
finally
FreeMem(Buf);
end;
end;
var
Buf: array[Byte] of Char;
begin
if Length(Format) < 100 then
FormatCommon(Buf)
else
FormatDynamicBuf;
end;
A simple test where the original gives an AV:
procedure TForm1.Button1Click(Sender: TObject);
var
LongFormat: string;
begin
Memo1.Text := FormatFloat('0000', 0.0, DefaultFormatSettings);
LongFormat := StringOfChar('0', 2000);
Memo1.Append(FormatFloat(LongFormat, 0.0, DefaultFormatSettings));
end;