java流水号生成规则(固定位数,先通过数字生成,数字用完字母生成)

6 篇文章 1 订阅
3 篇文章 0 订阅

今天来分享一个比较有意思的递增规则,开始也研究了一会,把高中学的等比等差都用上了,小喝了一杯茶,游荡一圈回来恍然大悟,所以说劳逸结合还是蛮重要的。下面进入正题:

我的规则是第一位作为头,后面作为流水号,当然头也是可变的,从1到Z,只是在流水号从XXX001用到XXX999,z最后用到XXXZZZ的时候,头才会加一个,先贴代码:

public static void main(String[] args) throws Exception {
    String customDotNum = customDotNum("10ZZZ", 4);
    System.out.println(customDotNum);
}


/**
  * 生成当前头+流水序号
  * 
  * @param nowNetwork 当前头+流水序号
  * @param serialLength 流水序号长度
  * @return 返回下一个头+流水序号
  * @throws Exception
  */	
private static String customDotNum(String nowNetwork, int serialLength) throws Exception {
    // 如果是什么都没有
    StringBuilder stringBuilder = new StringBuilder();
    if (nowNetwork == null || nowNetwork.length() == 0 || "null".equals(nowNetwork)) {
        stringBuilder.append("A");
	for (int i = 0; i < serialLength; i++) {
	    stringBuilder.append("0");
	}
    } else {
        stringBuilder.append(nowNetwork);
    }

    if (stringBuilder.length() != serialLength + 1) {
        throw new Exception("参数长度与传入长度不符:network:" + stringBuilder.toString() + " serialLength:" + serialLength);
    }
    if (serialLength < 1 || serialLength > 12) {
        throw new Exception("长度格式有误,长度必需在1-12之间");
    }

    String header = stringBuilder.substring(0, 1);
    String driver = "";
    try {
        driver = driver(stringBuilder.substring(1));
    } catch (Exception e) {
        char charAt = stringBuilder.charAt(0);
	if (charAt == 'Z') {
    	    throw new Exception("数据头已溢出");
	}
	if (charAt == '9') {
	    charAt = '@';
	}
	AtomicInteger atomic = new AtomicInteger(charAt);
	header = String.valueOf((char) atomic.incrementAndGet());
	StringBuilder stringBuilder1 = new StringBuilder();
	for (int i = 0; i < serialLength; i++) {
	    stringBuilder1.append("0");
	}
	try {
	    driver = driver(stringBuilder1.toString());
	} catch (Exception e0) {
	    e0.printStackTrace();
	}
    }
    return header + driver;
}


/**
  * 生成流水序号
  * 
  * @param driver 当前头+流水序号
  * @return 返回下一个流水序号
  * @throws Exception
  */	
public static String driver(String driver) throws Exception {
    driver = driver.toUpperCase();
    char[] charArray = driver.toCharArray();
    AtomicInteger z = new AtomicInteger(0);
    for (int i = charArray.length - 1; i >= 0; i--) {
        char c = charArray[i];
	// 先判断满Z进1的情况
	if (c == 'Z') {
	    if (i == 0) {
		throw new Exception("数据已溢出");
	    }
	    charArray[i] = 'A';
	    z.set(1);
	    continue;
	}

	if (c == '9') {
	    // 如果到了第一位还是9
	    if (i == 0) {
		charArray[i] = 'A';
		break;
	    }
	    charArray[i] = '0';
	    z.set(1);
	    continue;
	}
	// 如果等于1则需要进位1
	if (z.intValue() == 1 || i == charArray.length - 1) {
	    AtomicInteger atomic = new AtomicInteger(c);
	    charArray[i] = (char) atomic.incrementAndGet();
	    z.set(0);
	    break;
	}
    }

    return String.valueOf(charArray);
}

可以先看,太晚了先睡了,后续给代码做下说明,各位看官也可以拷贝下来自行跑跑看

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值