最近项目里面有个生成编号的需求,具体的要求就是:
1、一级编号从01开始,一直到99,当超过99的时候,从001开始,到999,以此类推
2、二级和三级编号从001开始,到999,超过999,从0001开始,以此类推
3、二级编号前面要拼接上对应的一级编号,比如一级编号为01,下面挂着第一个二级编号为01001,第二个为01002,。。。。三级编号要拼接上对对应的二级编号,比如二级编号为01001,下面挂着两个三级编号,分别为01001001,01001002.。。。
下面就需求的第一条和第二条代码实现做一下笔记记录,第三条实现相对简单,因为在生成编号的时候一定会用到父级编号,所以只需要在生成的编号前面加上拼接上父级编号即可,废话不多说,直接上代码:
public class NumGenerate {
/**
* 根据当前的编码最大值生成编码
*
* @param curNo 当前编号
* @param initLength
* @return
*/
public String getNextNumber(String curNo, int initLength) {
return getNextNumber(Integer.parseInt(curNo), initLength);
}
/**
* 根据当前的最大值生成编码
*
* @param currentMax 当前最大值
* @param initLength 初始长度,默认为2,也就是从01开始
* @return
*/
public String getNextNumber(Integer currentMax, int initLength) {
currentMax++;
return formatNumber(currentMax, initLength);
}
/**
* 格式化
* @param number
* @param initLength
* @return
*/
private String formatNumber(int number, int initLength) {
int digits = initLength; // 初始为 2 位
// 根据当前编号确定所需的位数
while (number > Math.pow(10, digits) - 1) {
digits++;
}
return String.format("%0" + digits + "d", number % 10 == 0 && digits > initLength ? 1 : number);
}
public static void main(String[] args) {
NumGenerate generator = new NumGenerate();
for (int i = 0; i <= 99; i++) {
System.out.print("," + generator.getNextNumber(i, 2));
}
System.err.println();
System.err.println("-----------------------------------------");
for (int i = 0; i <= 999; i++) {
System.out.print("," + generator.getNextNumber(i, 3));
}
}
}
单元测试:
@Test
public void getNextNumber1() {
NumGenerate generator = new NumGenerate();
System.err.println(generator.getNextNumber("01", 2));
System.err.println(generator.getNextNumber("02", 2));
System.err.println(generator.getNextNumber("99", 2));
System.err.println(generator.getNextNumber("98", 2));
System.err.println(generator.getNextNumber("999", 2));
System.err.println(generator.getNextNumber("998", 2));
System.err.println("----------------------------------------------");
System.err.println(generator.getNextNumber("01", 3));
System.err.println(generator.getNextNumber("02", 3));
System.err.println(generator.getNextNumber("99", 3));
System.err.println(generator.getNextNumber("98", 3));
System.err.println(generator.getNextNumber("999", 3));
System.err.println(generator.getNextNumber("998", 3));
System.err.println(generator.getNextNumber("9999", 3));
System.err.println(generator.getNextNumber("9998", 3));
}
其中最核心的就是formatNumber方法,入参是当前已经生成的编号的最大值和初始化的长度,当前编号通常是记录在缓存或者数据库里面,直接查询即可,然后转成int类型的传入,formatNumber方法的while就是在判断99,999这种临界值,如果小于临界值,最后的return就是直接返回传入的编号加1的值,一级编号的时候(初始长度为2),比如传入的是01,那么返回02,传入10,返回11,如果传入的是99,那么最后的digits的值就是3,返回的就是001,二级编号的时候(初始长度为3),比如传入的是01,那么返回02,传入10,返回11,如果传入的是99,返回100