根据输入数字串,返回连续的数字组合,比如输入“1,2,3,5,6,9”返回“1-3;5-6;9” Delphi6实现(方法2)

本文介绍了一种用于整理和简化输入的数字序列的方法,该方法能够将连续的数字序列转换为区间表示形式,如将'1,2,4,5,6,11,13,14'转换为'1-2;4-6;11;13-14',便于理解和阅读。此算法适用于处理大量离散数字的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个方法跟上一个方法相比会消耗一些效率,还需要起始数和结束数,但不受其他字符、重复、顺序干扰。具体如下:

{-------------------------------------------------------------------------------
  过程名:    TSerialNumberDemo.OutputSearialNum  方法二
  作者:      Administrator
  日期:      2013.06
  参数:      ASource: string
  返回值:    string
  用途:     根据输入的1,2,4,5,6,11,13,14返回1-2;4-6;11;13-14
-------------------------------------------------------------------------------}
function TSerialNumberDemo.OutputSearialNum(ASource: string; AMin,
  AMax: Integer): string;
var
  v_Start: Integer;
  v_End: Integer;
  v_Index: Integer;
  v_TmpList: TStringList;
  v_ResList: TStringList;
  v_ResStr: string;
begin
  if trim(ASource) = EmptyStr then
  begin
    Result := '无';
    Exit;
  end;  
  v_TmpList := TStringList.Create;
  v_ResList := TStringList.Create;
  try
    v_TmpList.CommaText := ASource;
    v_Start := -1;
    v_End := -1;
    for v_Index := AMin to AMax do
    begin
      if v_TmpList.IndexOf(IntToStr(v_Index)) >= 0 then
      begin
        if v_Start = -1 then
        begin
          v_Start := v_Index; //“-前的值”
        end else
        if (v_TmpList.IndexOf(IntToStr(v_Index + 1)) < 0) and (v_Start < AMax) or (v_Index = AMax) then
        begin
          v_End := v_Index;  //此处后面不连续,保存为“-后的值”
          v_ResList.Add(IntToStr(v_Start));
          v_ResList.Add('-');
          v_ResList.Add(IntToStr(v_End));
          v_ResList.Add(';');
          v_Start := -1;
        end;
      end else
      begin
        if v_Start <> -1 then
        begin
          v_ResList.Add(IntToStr(v_Start));
          v_ResList.Add(';');
          v_Start := -1;
        end;
      end;
      if v_Start = AMax then
      begin
        v_ResList.Add(IntToStr(v_Start));
        v_ResList.Add(';');
      end;
    end;
    v_ResStr := EmptyStr;
    for v_Index := 0 to v_ResList.Count - 1 do
    begin
      v_ResStr := v_ResStr + v_ResList[v_Index];
    end;
    Result := v_ResStr;
  finally
    v_TmpList.Free;
    v_ResList.Free;
  end;
end;

procedure TSerialNumberDemo.btnTest2Click(Sender: TObject);
begin
  ShowMessage(Self.OutputSearialNum(edtInputNumStr.Text, 1, 100));//测试
end;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值