我现在有这么一个需求,
就是一个编号,它的生成规则是:编号前缀+日期+4位的流水号,如文档200709250001
现在编号前缀是动态获得的,日期取当前日期,流水号自动更新累加。
我现在需要的结果是,如果改动编号前缀,4位流水号又重新从0001开始累加,改变日期我使4位的流水号从0001开始累加,如果做啊?用java实现。如现在的流水号是:文档200709250001 .... 文档200709250010
现在编号前缀改变为“新闻”,那生成的编号变成 新闻200709250001 又从0001开始。
改变日期也是一样,
如今天是 文档200709250001 .... 文档200709250010
明天来如果编号前缀不变,那么将变成:
从“文档200709260001”开始。
就是一个编号,它的生成规则是:编号前缀+日期+4位的流水号,如文档200709250001
现在编号前缀是动态获得的,日期取当前日期,流水号自动更新累加。
我现在需要的结果是,如果改动编号前缀,4位流水号又重新从0001开始累加,改变日期我使4位的流水号从0001开始累加,如果做啊?用java实现。如现在的流水号是:文档200709250001 .... 文档200709250010
现在编号前缀改变为“新闻”,那生成的编号变成 新闻200709250001 又从0001开始。
改变日期也是一样,
如今天是 文档200709250001 .... 文档200709250010
明天来如果编号前缀不变,那么将变成:
从“文档200709260001”开始。
public interface NoCreater{
//根据最大的数据生成,
//type:文档类型字符串;thedate:当前日期
//maxNo为当前最大编号,如果当前文档.当前日期还没有编号,则参数为NULL
public String createNo(String filetype,String thedate,String maxNo);
}
//默认的生成编号算法,可以扩充
public class DefaultNoCreater implements NoCreater{
public String createNo(String filetype,String thedate,String maxNo){
if (maxNo == null)
return filetype+thedate+'0001';
//否则返回最后四位+1后与前面的字符串相连
return ...
}
}//以下是生成编号所需基础数据生成器
public interface NoCreaterBasicInfo{
public String getType();
public String getDate();
public String getMaxNo();
}
public class CustomNoCreater extends DefaultNoCreater{
private NoCreaterBasicInfo basicInfo; public CustomNoCreater(NoCreaterBasicInfo basicInfo){
this.basicInfo = basicInfo;
} public String getNo(){
super.createNo(basicInfo.getType(),basicInfo.getDate(),basic.getMaxNo());
}
//先为NoCreaterBasicInfo生成一个默认基类
public abstract class DefaultNoCreaterBasicInfo{
public abstract String getType();
public String getDate(){
java.util.Date d = now();
return d.getYear().toString+d.getMonth().toString()+d.getDay().toString();
} public String getMaxNo(){
...
}
}
//以下为你使用常用类型
public abstract class FileBasicInfo extends DefaultNoCreaterBasicInfo{
public String getType(){
return '文档';
}
}public abstract class FileBasicInfo{
public String getType(){
return '新闻';
}
}
}
public abstract class NewsBasicInfo extends DefaultNoCreaterBasicInfo{
public String getType(){
return '新闻';
}
}
String curr ="新闻200709250010";
String result =curr.substring(0,curr.indexOf("2"));
String mid = curr.substring(curr.indexOf("2"),curr.indexOf("2")+8);
String last = curr.substring(curr.indexOf("2")+8,curr.indexOf("2")+12);
if(!prev.equals(result)){
result = prev;
last = "0001";
}
if(!date.equals(mid)){
mid = date;
last = "0001";
}
result = result + mid + last;
System.out.println(result);
return result;
}
String prev ="新闻";//parameter
test(prev,date);
如果是数据库,
可以select Max(your_no) from your_db where your_no like (your_prefix | your_date)
如果取得到,就把后四位+1再凑成你要的字符串,如果取不到,就从1开始如果是文件,可以做一个properties文件
prefix=xxx
date=yyy
sequence=zzz
通过改变properties来获取新的编号如果是内存,那LS都说了
class SerialNumCreator{
private static int currentNo = 1;
private static String formattingDate = null;
private static String prefix = null;
public static String getSerialNum(String pre) {
if(prefix == null){
prefix = pre;
} else if(!prefix.equals(pre)){
currentNo = 1;
prefix = pre;
}
DateFormat dateFormat = new SimpleDateFormat("yyyMMdd");
String dateStr = dateFormat.format(new java.util.Date());
if(formattingDate == null){
formattingDate = dateStr;
} else if(!formattingDate.equals(dateStr)){
currentNo = 1;
formattingDate = dateStr;
}
String serialNum = "000" + currentNo;
currentNo ++;
serialNum = prefix + formattingDate + serialNum.substring(serialNum.length() - 4);
return serialNum;
}
}使用:
String serialNum = SerialNumCreator.getSerialNum("Document");
....另外:
如果上面的问题的答案是:流水号接着从“0011”计数,那么需要把各个前缀对应的当前流水号记录下来,比如放在一个Map里面
for exampleHashMap hm - new HashMap();
...
`//生成编号
String no = (String)hm.get(your_prefix);
if (no == null) {
hm.put(your_prefix, your_date + "," + "0001");
return your_prefix + your_date + "0001";
}
String[] tmp = no.split(",");
if (your_date.equals(tmp[0])) { //日期相同
tmp[1] = ("0000" + (Integer.parseInt(tmp[1])+1));
tmp[1] = tmp[1].subString(tmp[1].length-4, tmp[1].length);
hm.put(your_prefix, your_date + "," + tmp[1]);
return your_prefix + your_date + tmp[1];
}
hm.put(your_prefix, your_date + "," + "0001");
return your_prefix + your_date + "0001";
import java.util.Date;import java.util.Scanner;public class createArrary {
private String qianZui = "文档"; private String riQi = "20070925"; private int shuZi = 1; public void outputNumber(String qZui, String rQi) {
String temp = "";
if (qZui.trim().equals(qianZui)) {
if (rQi.trim().equals(riQi)) {
shuZi++;
} else {
shuZi = 1;
riQi = rQi;
}
} else {
qianZui = qZui.trim();
shuZi = 1;
}
temp = qianZui + rQi;
String stringShuZi = String.valueOf(shuZi);
for (int i = stringShuZi.length(); i < 5; i++)
temp = temp + "0";
temp = temp + stringShuZi;
System.out.println(temp);
} public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String date = sdf.format(new Date());
createArrary ca = new createArrary();
System.out.println("如想退出请输入exit");
for (;;) {
Scanner scan = new Scanner(System.in);
String qianZui = scan.next();
if (qianZui.trim().equals("exit")) {
break;
} else {
ca.outputNumber(qianZui, date);
}
}
}
}