![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Строку в список
KK © (2009-07-30 12:22:00)написал метод который преобразует строку вида:
'1-3, 9, 11-13'в список значений вида:
1
2
3
9
11
12
13
Код в принципе работает, но хотелось бы его улучшить, например, если строка вводится как:
'1 - 7, 9,11-1 5'
то алгоритм работает неправильно. Помогите с оптимизацией. Заранее спасибо.
procedure Tfrm_Main.Button1Click(Sender: TObject);
procedure SetAsString(const Value: string; List: TStrings);
var
P, P1: PChar;
S: string;
i, Pos_, H, L: Integer;
begin
List.Clear;
P := PChar(Value);
while P^ in [ #1..' '] do
P := CharNext(P);
while P^ <> #0 do
begin
P1 := P;
while (P^ > ' ') and (P^ <> ',') do
P := CharNext(P);
SetString(S, P1, P - P1);
Pos_ := Pos('-', S);
if Pos_ > 0 then
begin
L := StrToInt(Copy(S, 1, Pos_ - 1));
H := StrToInt(Copy(S, Pos_ + 1, Length(S) - Pos_ + 1));
for I := L to H do
List.Add(IntToStr(I));
end
else
List.Add(S);
while P^ in [ #1..' '] do
P := CharNext(P);
if P^ = ',' then
begin
P1 := P;
repeat
P := CharNext(P);
until not (P^ in [ #1..' ']);
end;
end;
end;
begin
SetAsString('1-7, 9, 11-15', lstb_Items.Items);
end;
KK (2009-07-30 12:34:00) [1]спасибо, теперь все ok
Anatoly Podgoretsky (2009-07-30 12:28:00) [2]> KK (30.07.2009 12:22:00) [0]
StringReplace
clickmaker (2009-07-30 12:26:00) [3]впрочем, если разбирать посимвольно, то Delete не нужна
просто, проходя по строке, отбирай только символы в диапазоне ['0'..'9', '-', ',']
clickmaker (2009-07-30 12:25:00) [4]> если строка вводится как:
>
> '1 - 7, 9,11-1 5'
ну так убери все символы, которые не цифры, не дефис и не запятая
Delete()