我需要一个通过相同行的按钮并查找字母,所以删除所有字母并只留下数字
示例:
fakestackoverflow;466546511
nulling;65496411
结果:
;466546511
;65496411
答案 0 :(得分:3)
您尚未明确说明要保留哪些字符以及要省略哪些字符。但无论如何,最好编写一般函数来过滤基于调用者提供的标准进行过滤的字符。像这样:
function Filter(const Input: string; const Keep: TFunc<Char, Boolean>): string;
var
C: Char;
N: Integer;
begin
SetLength(Result, Length(Input));
N := 0;
for C in Input do
if Keep(C) then
begin
inc(N);
Result[N] := C;
end;
SetLength(Result, N);
end;
我假设你正在使用传统的基于单一的字符串索引。
以下是如何调用该函数的演示:
{$APPTYPE CONSOLE}
uses
System.SysUtils, System.Character;
function Filter(const Input: string; const Keep: TFunc<Char, Boolean>): string;
var
C: Char;
N: Integer;
begin
SetLength(Result, Length(Input));
N := 0;
for C in Input do
if Keep(C) then
begin
inc(N);
Result[N] := C;
end;
SetLength(Result, N);
end;
function IsNotLetter(C: Char): Boolean;
begin
Result := not C.IsLetter;
end;
begin
Writeln(Filter('fakestackoverflow;466546511', IsNotLetter));
Writeln(Filter('nulling;65496411', IsNotLetter));
end.
<强>输出:强>
;466546511 ;65496411
您希望将此类转换应用于备忘录控件的内容。这样做:
Memo1.Text := Filter(Memo1.Text, IsNotLetter);
答案 1 :(得分:-2)
我使用这个功能:
TYPE CharSet = SET OF CHAR;
FUNCTION KeepChars(CONST S : STRING ; CONST Z : CharSet) : STRING;
VAR
I : Cardinal;
BEGIN
Result:='';
FOR I:=1 TO LENGTH(S) DO IF S[I] IN Z THEN Result:=Result+S[I]
END;
限制:仅用于保留8位字符。如果您希望它在Unicode中正常工作,您可以改为使用它:
FUNCTION KeepChars(CONST S,Keep : STRING) : STRING;
VAR
I : Cardinal;
BEGIN
Result:='';
FOR I:=1 TO LENGTH(S) DO IF POS(S[I],Keep)>0 THEN Result:=Result+S[I]
END;
限制:不能正确处理多字16位字符。