有一个字符串“assf0001”,这是一个员工编号。要求:
下一个员工,让这个编号“assf0001”自加一,变为“assf0002”。满十进一,也就是“assf0009”下一个编号是“assf0010”,最大的编号是“assf9999”。在下的思路是:
取出“0001”中的每一位,然后判断第一位是“9”则第二位加一。如果第二位也是“9”,则第三位加一。以此类推。大家还有其它比较好的方法吗?最好能给点代码,不甚感激。

解决方案 »

  1.   

    public static void Test()
    {
        Console.WriteLine(GetNext("assf0001"));
    }public static string GetNext(string s)
    {
        return Regex.Replace(s, @"\d+$", delegate(Match m) { return (int.Parse(m.Value) + 1).ToString().PadLeft(m.Length,'0'); });
    }
      

  2.   

    如果是固定位数的话,如下:
    string s = "assf0001";
    string ss =s.Substring(0,4)+ (Convert.ToInt32(s.Substring(4, 4)) + 1).ToString("0000");
      

  3.   

      public string GetNext(string id)
            {
                int n = int.Parse(id.Substring(4, 4));
                return string.Format("assf{0:0000}", n + 1);
            }
      

  4.   

    由于是固定长度,可以采用分段处理,对后四位按整数处理,
    i++;
    string sNum=i.ToString("0000");
    string id="assf"+sNum;
    可以自动增加。
      

  5.   


    void Main()
    {
     string s = "assf0101";
    string s1 = s.Substring(0, 4);
    s = s1 + (Convert.ToInt32(s.Replace(s1,"")) + 1).ToString("d4");
    Console.Write(s);
    }
    //assf0102
      

  6.   

    不要按字符。
    按数据就是了。每次生成下个员工编号的时,就是Int类型,加就是了。9+1=10...以此类推。位数不够组成字符串的时候补零即可
      

  7.   


    string prefix = "assf";
    string preCode = "assf0001";
    string nextCode = string.Format("{0}{1:d4}",prefix,
                    int.Parse(preCode.Replace(prefix,string.Empty))+1);
      

  8.   


                string a="assf";     for( int i =0;i<4;i++)
        {
                    Console.WriteLine(a + i.ToString().PadLeft(4,'0'));
        }
      

  9.   

    这是我写的一个自动增长的SQL函数,直接在SQL执行的,作用是如:0001-0010. 如果其中0002被你删掉了,那么你添加下一条会自动补上0002的位置.
    至于你说的那个前面加些字母的,我想这个应该不是什么难事情把,不用我说了。set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    ALTER FUNCTION [dbo].[GetNnum](@cardnum int) 
    RETURNS varchar(4)
    AS  
    BEGIN 
          DECLARE @CardID varchar(4),@cardstr varchar(4)        WHILE @cardnum>0
             BEGIN
                     set @CardID=right('0000'+CAST (@cardnum AS VARCHAR(4) ),4)
                     set @cardstr=''
                    select @cardstr=CardID from tb_card_input where CardID=''+@CardID+''
                     if @cardstr is null or @cardstr='' 
                         begin
                             return @CardID
                             set @cardnum=0
                         end
        else
                         set @cardnum=@cardnum+1
             END
            return(0)
    END
      

  10.   

    select @cardstr=CardID from tb_card_input where CardID=''+@CardID+''
    找到你的那个字段的表。
      

  11.   

    我尊重你的造诣,不过别让人找不到北.人家想实现什么,无外乎是pre+num而已,用简单的方法把二者区分开就行了,不要把人当傻子,手把手教,我是没那种能力,如果我是搞教育的,早找到更便捷的方法了.
      

  12.   

    sbwwkmyd老师:您认为"算盘"的计算方法效率更高么?我过去算日全食时,也用您认可的"算盘"算法搞过大数计算.后来被一位又懂易经,又懂C++的老师从那个论坛给轰出来了,原因是我给搞编程的人丢人了.
      

  13.   

    把前面的4个英文字母和后面的数字分别截取出来,把数字的字符串转成int类型后加1再转成字符串,获取没转成int类型的数字字符串的长度,如果转成int类型的长度小于没转的,就在前面用0补足长度
      

  14.   

    把前面的4个英文字母和后面的数字分别截取出来,把数字的字符串转成int类型后加1再转成字符串,获取没转成int类型的数字字符串的长度,如果转成int类型的长度小于没转的,就在前面用0补足长度
      

  15.   

    把前面的4个英文字母和后面的数字分别截取出来,把数字的字符串转成int类型后加1再转成字符串,获取没转成int类型的数字字符串的长度,如果转成int类型的长度小于没转的,就在前面用0补足长度
      

  16.   

    感觉那个字符串是assf+num,所以你可以分成两部分处理,让num顺序+1,然后再和前面的部分合并
      

  17.   

    把前面的4个英文字母和后面的数字分别截取出来,把数字的字符串转成int类型后加1再转成字符串,获取没转成int类型的数字字符串的长度,如果转成int类型的长度小于没转的,就在前面用0补足长度后与英文字母字符串合并就好
      

  18.   


    public static String getSeqID(){
    java.text.DecimalFormat format = new java.text.DecimalFormat("0000");    
    return "assf"+format.format((++num)%10000);
    }
      

  19.   

    话说MongoDB的默认主键 就是 固定长度的 类似楼主的要求 的数据
      

  20.   


    public class Staff{ private static int num=0;

    public static synchronized String getID(String preStr,int len){
    if(len<1){
    return preStr;
    }
    StringBuffer sb=new StringBuffer();
    for(int i=0;i<len;i++){
    sb.append("0");
    }
    java.text.DecimalFormat format = new java.text.DecimalFormat(sb.toString());    
    return preStr+format.format((++num)%10^len);
    }

    public static void main(String[] args) {
    System.out.println(getSeqNum("asdf",4));
    }}
      

  21.   

    太粗心了。
    再次纠正一次。 
    package cn.emay.util;public class Staff { private static int num = 0; public static synchronized String getID(String preStr, int len) {
    if (len < 1) {
    return preStr;
    }
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < len; i++) {
    sb.append("0");
    }
    java.text.DecimalFormat format = new java.text.DecimalFormat(sb
    .toString());
    return preStr + format.format((++num) % (10 ^ len));
    } public static void main(String[] args) {
    System.out.println(getID("asdf", 4));
    }}
      

  22.   

    package cn.emay.util;public class Staff { private static int num = 0; public static synchronized String getID(String preStr, int len) {
    if (len < 1) {
    return preStr;
    }
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < len; i++) {
    sb.append("0");
    }
    java.text.DecimalFormat format = new java.text.DecimalFormat(sb
    .toString());
    return preStr + format.format((++num) % (10 ^ len));
    } public static void main(String[] args) {
    System.out.println(getID("asdf", 4));
    }}
      

  23.   

    如果要获取的编号位数过长把num的类型修改成相应应的类型即可.
      

  24.   


    刚好有资源,相类似的,是用sql的存储过程实现的,前面一段是用时间来表示的,你可以改改,呵呵。
    --产生退货表编号
    alter proc proc_ExitNumber
    (
    @StrId varchar(20) output
    )
    as
    declare @Id varchar(20),
    @Str varchar(10),
    @Ing Int
     select @Id=max(eid) from exitshop where 
      Convert(int,Substring(eid,1,8))-  Convert(int,Convert(varchar(20),getdate(),112))=0
    --判断是否产生订单,如果产生则@Id不为空
    if @Id is null
      set @StrId=Convert(varchar(20),getdate(),112)+'001';
    else
      begin
      set @Str=Substring(@Id,1,8)
      set @Ing=1+Convert(Int,Substring(@Id,9,dataLength(@Id)))
           --print dataLength(@Id)
     
         if(len(@Ing)=1)
          set @StrId=@Str+'00'+Convert(varchar(10),(@Ing))
       print len(@Ing)
         if(len(@Ing)=2)
         set @StrId=@Str+'0'+Convert(varchar(10),(@Ing))
         if(len(@Ing)=3)
         set @StrId=@Str+Convert(varchar(10),(@Ing))
      end
      

  25.   

    你的那个可能会简单一些哦,因为不要判断时间嘛,只是那个max(eid)那里的eid要截取一下,不能直接max哦
    eid是你要的插入数据的id
    exitshop 是那张表,应该是知道的吧,呵呵。
      

  26.   


    public string GetNextStr(String str)
            {
                string strContant = str.Substring(0,4);
                int intNo = int.Parse(str.Substring(4,4)) + 1;
                return strContant + intNo.ToString().PadLeft(4,'0');
                //如果str = assf0001,那么return 为assf0002        }
      

  27.   

    assf0001
    你要的是后4位
    你用字符串截取到后四位
    将后四位强转为int类型
    不满足这个变量为9999让这个int型变量加一
    再将这个变量跟  assf +=不就得了
    这么简单
      

  28.   

    create table
    (
    No nvarchar(10),
    Flag int
    )
    assf0001--assf9999添加到数据库里,然后从数据库里取。
      

  29.   

    設計很重要,這種需求太搞怪,應該數據庫存儲就是ID,然後
    public string Num{
                get {
                    return "assf"+this.num;
                }
                set {
                    this.num= value;
                }
            }
      

  30.   

    从后面开始取数,判断是否是数字,如果是记住取得的长度。然后再用上面的方法累加。class Program
        {
            static void Main(string[] args)
            {
                string beginNo = "abc001";            Console.WriteLine(GetNextNoValue(beginNo));  //输出为 abc002            beginNo = "ABCDEFG00002";            Console.WriteLine(GetNextNoValue(beginNo));  //输出为 ABCDEFG00003            beginNo = "SSFE090ACEF0989";            Console.WriteLine(GetNextNoValue(beginNo));  //输出为 SSFE090ACEF0990            Console.Read();
            }        static string GetNextNoValue(string value)
            {
                if (value == null || value.Trim() == "")
                {
                    return null;
                }
                int cLen = 0;
                for (int i = value.Length - 1; i >= 0; i--)
                {
                    if (char.IsDigit(value[i]) == true)
                    {
                        cLen++;
                    }
                    else
                    {
                        break;
                    }
                }
                if (cLen > 0)
                {
                    int NewNo = Convert.ToInt32(value.Substring(value.Length - cLen, cLen)) + 1;
                    string NewValue = NewNo.ToString().PadLeft(cLen, '0');
                    return value.Substring(0, value.Length - cLen) + NewValue;
                }
                else
                {
                    return null;
                }
            }
        }
      

  31.   

    删除空格。static string GetNextNoValue(string value)
            {
                if (value == null || value.Trim() == "")
                {
                    return null;
                }
                value = value.Trim();
                int cLen = 0;
                for (int i = value.Length - 1; i >= 0; i--)
                {
                    if (char.IsDigit(value[i]) == true)
                    {
                        cLen++;
                    }
                    else
                    {
                        break;
                    }
                }
                if (cLen > 0)
                {
                    int NewNo = Convert.ToInt32(value.Substring(value.Length - cLen, cLen)) + 1;
                    string NewValue = NewNo.ToString().PadLeft(cLen, '0');
                    return value.Substring(0, value.Length - cLen) + NewValue;
                }
                else
                {
                    return null;
                }
            }