java自定义编号生成(支持前缀自定义)

    工作中要求合同编号自动生成 格式 NYZL-001,NYZL-002。。。在我的StringUtils工具类中新增如下方法,该方法可以自定义前缀以及当前排到数字几了(可从数据库中查询最大的编号+1)

/**
	 * 自动生成编号
	 * @param prefix  前缀,往往是一串字符串
	 * @param nowNum  当前要生成的数字
	 * @return
	 */
	public static synchronized String getConteactNo(String prefix,int nowNum ) {

		StringBuilder builder = new StringBuilder();
		StringBuilder num = new StringBuilder();
		AtomicInteger count = new AtomicInteger(nowNum);
		// 4位数字的采取编号处理。9999的情况下从001开始采取。
		if (count.get() > 9999) {
			count = new AtomicInteger(1);
		}

		// 采用4位数的数字进行序号处理。
		if (count.get() < 10) {
			num.append("00").append(count.getAndIncrement());
		} else if (count.get() >= 100) {
			num.append(count.getAndIncrement());
		} else {
			num.append("0").append(count.getAndIncrement());
		}

		// 组合。
		builder.append(prefix);
		builder.append(num);

		return builder.toString();
	}

 

保存时,将数据库最大编号查出,然后+1设置到工具类即可

int id = ParamUtils.getInt(request, "contractId", 0);
if (id == 0) {
            //新增
            String maxNo = this.contractManager.selectMaxContractNo();
            if (maxNo != null) {
                String[] split = maxNo.split("-");
                String contractNo = StringUtils.getConteactNo("NYZL-", Integer.valueOf(split[1]) + 1);
                contract.setContractNo(contractNo);
            } else {
                String contractNo = StringUtils.getConteactNo("NYZL-", 1);
                contract.setContractNo(contractNo);
            }
        }

 

优化建议:  将getAndIncrement改为 incrementAndGet  在调用时传入当前值即可(不用+1后再传入)

incrementAndGet     返回加1后的新值

getAndIncrement     返回旧值(即加1前的原始值)

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值