本帖最后由 u010594805 于 2013-05-06 23:48:01 编辑

解决方案 »

  1.   

    这个不复杂。一个循环,将找不到的第一个数记下,然后再往后找。注意用PosEx函数:
    function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer; //(加单元:StrUtils)
      

  2.   

    代码如下:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i, a, b: integer;
      s: string;
      slData: TStringList;
    begin
      slData := TStringList.Create;
      try
        slData.CommaText := '0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,55,56,57,58, 87,88,89,90,91,92';
        Memo1.Lines.Add(slData.Text);
        s := '';
        for i := 0 to slData.Count - 2 do
        begin
          a := StrToIntDef(slData.Strings[i], 0);
          b := StrToIntDef(slData.Strings[i+1], 0);
          if b - a <> 1 then
            s := s +','+ IntToStr(a+1) +'-'+ IntToStr(b-1);
        end;    if s <> '' then
        begin
          s := Copy(s, 2, Length(s) - 1);//去掉第一个逗号
          Memo1.Lines.Add(s);
        end;
      finally
        slData.Free;
      end;
    end;
      

  3.   

    用strList:Tstringlist 以,分隔,可以直接把那个字符串切了
    strList:=Tstringlist.create;
    Delimiter:=',';
    DelimitedText:=slData.CommaText;
    现在每个数都存入了Tstringlist。
      

  4.   

    求:如何求出中间断开的数字的最小值和最大值?
    我这个是已排序好的数了,那么断开的那个数+1是最小的,断开的最后一个数字-1是最大的 
    str1等于'0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,55,56,57,58, 87,88,89,90,91,92
    那么:
    22+1是最小的
    87-1是最大的
    思路是这样,算法自己搞定吧
      

  5.   

    不知道你的是什么版本,如果是xe2之类的,有split类的函数
    StrUtils.SplitString,分解为数组后,就很容易处理了。