假设有字符串:
1:如果有数字的话,就必须以 ## 结尾
2:有可能为空s:='1##2##5##21##28##'
现在我要找出 1,2,5,21,28并把 1,2,5,21,28 放到一个数组 A 里
A[0]:=1;
A[1]:=2;
A[2]:=5;
A[3]:=21;
A[4]:=28;当然做为参数的 s 是变化的。请教各位大哥,应该怎样写这个函数?谢谢!
1:如果有数字的话,就必须以 ## 结尾
2:有可能为空s:='1##2##5##21##28##'
现在我要找出 1,2,5,21,28并把 1,2,5,21,28 放到一个数组 A 里
A[0]:=1;
A[1]:=2;
A[2]:=5;
A[3]:=21;
A[4]:=28;当然做为参数的 s 是变化的。请教各位大哥,应该怎样写这个函数?谢谢!
TIntegerArray = Array of Integer;
Function ParseString(s:String):TIntegerArray;
var
i:Integer;
temp:String;
begin
Result:=nil;
While True do
begin
i:=Pos('##',s);
if i<=0 then Break;
temp:=Copy(s,1,i-1);
delete(s,1,i+1); SetLength(Result,Length(Result)+1);
Result[High(Result)]:=StrtoIntDef(temp,0);
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
b:TIntegerArray;
i:Integer;
begin
b:=ParseString('1##2##5##21##28##');
for i:=0 to High(b) do showmessage(inttostr(b[i]));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
str:string;
strlist:TstringList;
a:array of string;
i:integer;
begin
str:='1##2##5##21##28##';
try
strlist:=TstringList.create;
strlist.CommaText:=str;
strlist.Delimiter:='##';
setlength(a,strlist.Count);
for i:=0 to strlist.Count-1 do
begin
a[i]:=strlist.Strings[i];
showmessage(a[i]);
end;
finally
strlist.Free;
end;
end;
for i:=1 to length(s) do
if (s[i]>'0') and (s[i]<'9') then
begin
ShowMessage('Include number');
end;
我的思路和你的一样,不过我不太同意你的做法因为Delimiter接受的是一个Char,而'##'却是一个String
所以在做你的动作之前,需要将'##'换成一个'#'或者其它字符其实 firstshine(黑里透红) 的方法也不错
不过我不太喜欢用Pos函数,我觉得由自己来判断或许会比较好一点
var
str:string;
strlist:TstringList;
a:array of string;
i:integer;
begin
str:='1##2##5##21##28##';
str:=StringReplace(str, '##', ',', [rfReplaceAll]);
try
strlist:=TstringList.create;
StrList.CommaText := str;
setlength(a,strlist.Count);
for i:=0 to strlist.Count-1 do
begin
a[i] := strlist.Strings[i];
//可以在这里加入一句判断,如果为空,那么不输出
showmessage(a[i]);
end;
finally
strlist.Free;
end;
end;