Главная страница
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
15-1236243315
Mephisto
2009-03-05 11:55
2009.05.10
Regular Expression


15-1236173683
Skier
2009-03-04 16:34
2009.05.10
Перевод старых записей в mp3


2-1238425047
yammi
2009-03-30 18:57
2009.05.10
Помогите с синтаксисом, как код Builder в дельфи записать?


15-1235944412
Nic
2009-03-02 00:53
2009.05.10
MySQL-база на хостинге и клиент на Delphi


3-1219412270
Курдль
2008-08-22 17:37
2009.05.10
PL/SQL Цикл по полям.