Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.10;
Скачать: CL | DM;

Вниз

принадлежит ли значение набору   Найти похожие ветки 

 
J.S.   (2009-03-25 16:23) [0]

Столкнулся с проблемой: необходимо проверить принадлежит ли челочисленное значение набору значений (набор значений представлен строкой вида "1-6, 11, 22-46"). Какие Вы можете посоветовать варианты реализации?.


 
clickmaker ©   (2009-03-25 16:41) [1]

1.посимвольный разбор
2.регулярные выражения


 
Jeer ©   (2009-03-25 16:41) [2]

парсер


 
MBo ©   (2009-03-25 16:42) [3]

3. если диапазон позволяет, перевести строку в set


 
Юрий Зотов ©   (2009-03-25 17:02) [4]

const
 ValidValues = [1..6, 11, 22..46];
var
 Value: byte;
========
if Value in ValidValues then ...


 
Anatoly Podgoretsky ©   (2009-03-25 17:06) [5]

> J.S.  (25.03.2009 16:23:00)  [0]

Посоветую set of char


 
жж   (2009-03-26 00:20) [6]

function IsPartOf(X: Integer; S: string): Boolean;
var
 SL: TStringList;
 N: Integer;
 s1, s2: string;
begin
 Result:=false;
 SL:=TStringList.Create;
 try
   SL.Delimiter:=",";
   SL.DelimitedText:=s;
   for I:=0 to SL.Count - 1 do
   begin
     N:=Pos("-", SL[I]);
     if N = 0
      then Result:=(X = StrToInt(SL[I]))
      else begin
        s1:=Copy(Sl[I], 1, N);
        s2:=Copy(Sl[I], N + 1, Length(SL));
        Result:=X >=StrToInt(s1) and X <=StrToInt(s2);
      end;
     if Result then Break;
   end;
finally
 SL.Free;
end;

ЗЫ
Набивал текст тут, так что не отлажено, обработка ошибочных входных данных, например "1-6, 11, 22а-46" отсутствует, тут уж сам)


 
Германн ©   (2009-03-26 00:34) [7]


> жж   (26.03.09 00:20) [6]

Я бы не стал изобретать некие функции с ограниченной областью применения, пока автор не ответил на [3] и [4].
Или хотя бы вообще вновь появился на форуме. :)


 
жж   (2009-03-26 19:18) [8]


> Германн ©   (26.03.09 00:34) [7]


Да в общем то, недолго.

а по  поводу сетов не совсем ясно - как перевести строку такого формата в сет без парсинга


 
Zeqfreed ©   (2009-03-26 21:04) [9]

def mrange(spec):
         for rng in spec.split(","):
                 if rng.find("-") > -1:
                         min, max = rng.split("-")
                 else:  
                         min, max = [rng] * 2
                 for i in xrange(int (min), int (max) + 1):
                         yield i

for i in range(0, 25):
         if i in mrange("1-6,11,22-24"):
                 print "%d in range" % i


Само изящество :)


 
Германн ©   (2009-03-27 00:46) [10]


> жж   (26.03.09 19:18) [8]
>
>
> > Германн ©   (26.03.09 00:34) [7]
>
>
> Да в общем то, недолго.
>
> а по  поводу сетов не совсем ясно - как перевести строку
> такого формата в сет без парсинга

Парсинг ты уже сделал. Но сам вопрос не ясен. Откуда автор получает эту строку?
Может и парсинг не нужен?
Но без участия в форуме автора - дальнейшее обсуждение не имеет смысла!



Страницы: 1 вся ветка

Текущий архив: 2009.05.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.007 c
2-1238068203
D@nger
2009-03-26 14:50
2009.05.10
Операционка ругается


15-1236461409
Юрий
2009-03-08 00:30
2009.05.10
С днем рождения ! 8 марта 2009 воскресенье


2-1237987387
J.S.
2009-03-25 16:23
2009.05.10
принадлежит ли значение набору


2-1238153841
igorntk
2009-03-27 14:37
2009.05.10
Как скопировать запись из одного TEdit в другой?


2-1238076122
DevilDevil
2009-03-26 17:02
2009.05.10
Глупый вопрос. Путь к bpl.