JAVA流水号生成规则(按默认规则递增,数字不够添加字母递增,位数不够自动加1)_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > JAVA流水号生成规则(按默认规则递增,数字不够添加字母递增,位数不够自动加1)

JAVA流水号生成规则(按默认规则递增,数字不够添加字母递增,位数不够自动加1)

 2014/4/2 18:18:23  abio1023  程序员俱乐部  我要评论(0)
  • 摘要:写道在某些应用场景中,因业务需要,一般的流水号(前缀+日期或时间+流水号)规则无法满足业务需要,以下是因业务需要拓展出来的流水号生成规则业务要求:1.默认限定位数的数字递增2.在限定位数数字达到全部为9的时候,用字母替换最后一位,数字归0再次递增3.当字母长度为限定位数长度并且字母都为Z的时候,限定长度加1预期结果(限定长度4位,从1开始):0001...9999...001A...001B...001Z...01AZ..........1ZZZ...AZZZ..BZZZ..ZZZZ..
  • 标签:Java
写道 在某些应用场景中,因业务需要,一般的流水号(前缀+日期或时间+流水号)规则无法满足业务需要,以下是因业务需要拓展出来的流水号生成规则

业务要求:
1.默认限定位数的数字递增
2.在限定位数数字达到全部为9的时候,用字母替换最后一位,数字归0再次递增
3.当字母长度为限定位数长度并且字母都为Z的时候,限定长度加1

预期结果(限定长度4位,从1开始):
0001...9999...001A...001B...001Z...01AZ..........1ZZZ...AZZZ..BZZZ..ZZZZ...10000


以下抛砖引玉,如有更好的方案欢迎各位留言

?

class="java">/**
 *
 */
package org.ab.test;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Project ABComponents
 * @Copyright ? 2008-2014 SPRO Technology Consulting Limited. All rights reserved.
 * @fileName org.ab.test.SeriNumber.java
 * @Version 1.0.0
 * @author Allan Ai
 * @time 2014-4-2
 *
 */
public class SeriNumber {

	public static void sn(int len,Integer i,String driver){
		String dr = "";
		AtomicInteger z = new AtomicInteger(i);
		z.getAndIncrement();
		if(z.toString().length()>(len-(driver!=null?driver.length():0))){
			dr = driverCheck(driver,len);
			if(dr.equals(".N")){//如超出限定长度并字母都为Z的时候,限定长度加1,dr重新开始,默认为空
				len++;
				dr = "";
			}else{
				z.set(1);
			}
		}else{
			dr = driver;
		}
		
		if(dr.length()==len){
			System.out.println(dr);
		}else{
			System.out.println(String.format("%0"+(len-dr.length())+"d", z.intValue())+dr);
		}
	}
	
	/**
	 * 字母有效检查
	 * 1.检查字母是否都为Z
	 * 2.检查字母长度
	 * @param driver
	 * @param len
	 * @return
	 */
	public static String driverCheck(String driver,int len){
		char[] charArray = driver.toCharArray();
		AtomicInteger z = new AtomicInteger(0);
		
		for (char c : charArray) {
			if(c=='Z'){
				z.getAndIncrement();
			}
		}

		if(z.intValue()==driver.length() && z.intValue()==len){//如所有字母都为Z,并且长度达到限定长度,返回.N
			return ".N";
		}else if(z.intValue()==driver.length() && z.intValue()<len){//如果所有字母都为Z,但长度未达到限定长度,则在调用字母递增方法之前加入@用以递增A
			return driver("@"+driver);
		}else{//以上两个条件都不满足,则直接递增
			return driver(driver);
		}
		
	}
	
	/**
	 * 字母递增
	 * @param driver
	 * @return
	 */
	public static String driver(String driver){
		if(driver!=null && driver.length()>0){
			char[] charArray = driver.toCharArray();
			AtomicInteger z = new AtomicInteger(0);
			for(int i = charArray.length-1;i>-1;i--){
				if(charArray[i]=='Z'){
					z.set(z.incrementAndGet());
				}else{
					if(z.intValue()>0 || i==charArray.length-1){
						AtomicInteger atomic = new AtomicInteger(charArray[i]);
						charArray[i]=(char) atomic.incrementAndGet();
						z.set(0);
					}
				}
			}
			
			return String.valueOf(charArray);
		}else{
			return "A";
		}
	}
	
	public static void main(String[] args) {
		sn(3, 999, "Z");
		
	}
}

?

上一篇: 开源 免费 java CMS - FreeCMS1.7 信息审核 下一篇: 没有下一篇了!
发表评论
用户名: 匿名