gpt4 book ai didi

delphi - Delphi中是否有*SysUtils.Format*的反函数

转载 作者:行者123 更新时间:2023-12-03 14:41:18 27 4
gpt4 key购买 nike

有人为 Delphi 编写过“UnFormat”例程吗?

我想象的是SysUtils.Format,看起来像这样

UnFormat('一个数字 %n 和另一个 %n',[float1, float2]);

因此,您可以使用格式字符串将字符串解压缩为一系列变量。

我看过 SysUtils 中的“Format”例程,但我从未使用过汇编,所以它对我来说毫无意义。

最佳答案

这在 C 中称为 scanf,我为此制作了一个类似的 Delphi :

function ScanFormat(const Input, Format: string; Args: array of Pointer): Integer;
var
InputOffset: Integer;
FormatOffset: Integer;
InputChar: Char;
FormatChar: Char;

function _GetInputChar: Char;
begin
if InputOffset <= Length(Input) then
begin
Result := Input[InputOffset];
Inc(InputOffset);
end
else
Result := #0;
end;

function _PeekFormatChar: Char;
begin
if FormatOffset <= Length(Format) then
Result := Format[FormatOffset]
else
Result := #0;
end;

function _GetFormatChar: Char;
begin
Result := _PeekFormatChar;
if Result <> #0 then
Inc(FormatOffset);
end;

function _ScanInputString(const Arg: Pointer = nil): string;
var
EndChar: Char;
begin
Result := '';
EndChar := _PeekFormatChar;
InputChar := _GetInputChar;
while (InputChar > ' ')
and (InputChar <> EndChar) do
begin
Result := Result + InputChar;
InputChar := _GetInputChar;
end;

if InputChar <> #0 then
Dec(InputOffset);

if Assigned(Arg) then
PString(Arg)^ := Result;
end;

function _ScanInputInteger(const Arg: Pointer): Boolean;
var
Value: string;
begin
Value := _ScanInputString;
Result := TryStrToInt(Value, {out} PInteger(Arg)^);
end;

procedure _Raise;
begin
raise EConvertError.CreateFmt('Unknown ScanFormat character : "%s"!', [FormatChar]);
end;

begin
Result := 0;
InputOffset := 1;
FormatOffset := 1;
FormatChar := _GetFormatChar;
while FormatChar <> #0 do
begin
if FormatChar <> '%' then
begin
InputChar := _GetInputChar;
if (InputChar = #0)
or (FormatChar <> InputChar) then
Exit;
end
else
begin
FormatChar := _GetFormatChar;
case FormatChar of
'%':
if _GetInputChar <> '%' then
Exit;
's':
begin
_ScanInputString(Args[Result]);
Inc(Result);
end;
'd', 'u':
begin
if not _ScanInputInteger(Args[Result]) then
Exit;

Inc(Result);
end;
else
_Raise;
end;
end;

FormatChar := _GetFormatChar;
end;
end;

关于delphi - Delphi中是否有*SysUtils.Format*的反函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72672/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com