在项目开发中,经常遇到流水号生成的问题。需求:生成4位的流水号,从A001、A002一直递增到ZZZZ结束。

主要思路:分为字母和数字两部分,分情况进行考虑处理,主要在于如何处理临界点的进位问题。

java实现代码如下:

public class NumberTest {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubNumberTest nt = new NumberTest();//测试System.out.println(nt.generateNum(4,null));System.out.println(nt.generateNum(4,"ZZZ9"));//打印所有流水号String initStr="9999";while(!initStr.equals("ZZZZ")){initStr=nt.generateNum(4,initStr);System.out.println(initStr);}}public String generateNum(int digit,String currentStr){char[] alphatableb = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I','J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U','V', 'W', 'X', 'Y', 'Z' };//流水序号,默认4位String formatStr1 = "0000";int maxNum = 9999;StringBuffer tmpBuff = new StringBuffer();StringBuffer tmpBuff1 = new StringBuffer();for(int i=1;i<digit;i++){tmpBuff.append(0);tmpBuff1.append(9);}formatStr1 = tmpBuff.toString()+"0";maxNum = Integer.parseInt(tmpBuff1.append(9).toString());String initStr = "";if(currentStr==null){initStr = maxNum+"";}else{initStr = currentStr;}//找出字符串最后一位字母int sign=0;boolean isfind = false;for(int i=initStr.length()-1;i>=0;i--){if(initStr.charAt(i)>='A' && initStr.charAt(i)<='Z'){sign=i;isfind = true;break;}}//分隔字母和数字String letterStr="";String numStr="";if(isfind){letterStr=initStr.substring(0, sign+1);numStr=initStr.substring(sign+1);}else{numStr=initStr;}//如果数字部分不全为9,则直接加一,返回boolean isAllNine=false;for(int i =0;i<numStr.length();i++){if(numStr.charAt(i)=='9'){isAllNine = true;          }else{isAllNine = false;break;}}if(!isAllNine && !"".equals(numStr)){int nextNum = Integer.parseInt(numStr)+1;return letterStr+addNumPrefix(nextNum,numStr.length());}else{//数字部分全为9或者数字部分为空,需要分情况分析String nextNum = "";if("".equals(letterStr)){//字母部分为空String nineStr = numStr.substring(1);nextNum = "A"+revertNineToFirst(nineStr);}else{//字母部分不为空//判断字母部分的最后一位字母是否有下一位,比如A,则有下一位B,Z则没有。char lastLetter =  letterStr.charAt(letterStr.length()-1);int pos = -1;//顺序查找for(int i=0;i<alphatableb.length;i++){if(alphatableb[i]==lastLetter){pos = i;break;}}if(pos==-1){System.out.println("查找字母出错");return "error";}    if('Z'==alphatableb[pos]){//最后一位字母为'Z'if(!"".equals(numStr)){//Z999nextNum = letterStr.substring(0, letterStr.length()) + 'A' + revertNineToFirst(numStr.substring(1));}else{//ZZZZSystem.out.println("商户序号已达到最大值,请联系管理员");return "error";} }else{//最后一位字母不为'Z'if(!"".equals(numStr)){//ZA99nextNum = letterStr.substring(0, letterStr.length()-1) + alphatableb[pos+1] + revertNineToFirst(numStr);}else{ //ZZZAnextNum = letterStr.substring(0, letterStr.length()-1) + alphatableb[pos+1];}   }}return nextNum;}  }/*** 补充数字前缀* @param nextNum* @param numLen * @return*/private String addNumPrefix(int nextNum, int numLen) {StringBuffer tmpBuff = new StringBuffer();for(int i=0;i<numLen;i++){tmpBuff.append(0);}DecimalFormat format = new DecimalFormat(tmpBuff.toString());return format.format(nextNum);}/*** 转化999为001* @param nineStr* @return*/public String revertNineToFirst(String nineStr){  if("".equals(nineStr)) return nineStr;String zeroStr = nineStr.replace('9', '0');DecimalFormat format = new DecimalFormat(zeroStr);int firstNum = Integer.parseInt(zeroStr)+1;return format.format(firstNum);}}

java获取A001、A002...到ZZZZ的流水号算法(字母加数字)相关推荐

  1. java生成大小写字母加数字的随机数

    项目中用到一授权码,网上搜索资源整理后发表 public class Random {/*** 生成32位大小写加数字随机数* @param args*/public static void main ...

  2. java正则校验-密码至少要由包括大小写字母、数字、标点符号的其中两项,共计8-16位编码组成

    很多朋友在问正则组合校验的问题,但网上那些大都是不对的,现贴上我在项目中写的部分源码供大家取用. String regex = "^(?![A-Za-z]+$)(?!\\d+$)(?![\\ ...

  3. java获取0001、0009、000Z、A99Z、A9A0...到ZZZZ的下一个流水号算法(字母加数字)

    业务需求:从0000开始到ZZZZ: 显示数字0~9,再接上A ~ Z(跳过大写的字母O); 9结束之后为A: Z结束为0,同时前一位进一: 不限字符串长度: 举例:A999的下一位为A99A A99 ...

  4. Java生成固定长度的随机字符串(以大小写字母和数字)

    package org.jimmy.autosearch2019.test;import java.util.ArrayList; import java.util.Random;/*** @auth ...

  5. java显示字母数字组合_Java字母加数字组合比较大小

    针对字符串是数字和字母结合而进行的,如"a20"和"a9";比较而得出结果是"a20">"a9".这种情况直接调用 ...

  6. java生成短信验证码 字母加数字的验证码

    /*** 获取随机验证码* @param length 验证码的长度* @return*/ public static String getRandomString(int length) {Stri ...

  7. Java字母加数字组合比较大小

    有这样一种情况,需要比较纯英文,纯数字,英文混杂的组合大小 解决办法:根据ASC||码,数字<小写英文<大写英文, 比较顺序就是先比较第一个字符,如果比较出大小就停止,给出结果,否则比较第 ...

  8. Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几

    Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几 //获得入参的日期 Calendar cd = Calendar.getInstance(); cd.setTime(date ...

  9. Java获取照片的Exif信息,并解析GPS

    Java获取照片的Exif信息,并解析GPS 1. 效果图 2. 什么是Exif? 3. 源代码 参考 ❤️ 这篇博客将介绍什么EXIF,以及如何用Java语言读取Exif信息,并转换经纬度为位置信息 ...

最新文章

  1. 首款鸿蒙p系om统终端,华为全力赋能:首款鸿蒙系统终端荣耀智慧屏,距离上市销售倒计时...
  2. 蓝湖怎么切图标注_【蓝湖指北】一张图教你如何选择标注尺寸
  3. python模块使用_PYthon模块使用教程(最新).doc
  4. Java集合:set的遍历方式
  5. 上海博彦科技 千万别来_这个年产值2870亿元的科技园区,将率多家企业亮相本届服贸会...
  6. .NET6之MiniAPI(二十):实体验证FluentValidation
  7. python邮件发送哪个好_python发邮件(一)
  8. 2016年全国计算机技术与软件,2016年的上半年的全国计算机技术与软件专业技术资格(水平)考.doc...
  9. 随机过程在数据科学和深度学习中有哪些应用?
  10. Dubbo 新编程模型之外部化配置 1
  11. Batch入门教程(2)
  12. SharePoint 网站搬迁
  13. 网游设想二:九重天[]
  14. adb 黑域app_黑域app|黑域手机工具下载 V1.3_下载 - 偶要下载手机频道
  15. 我的软考高项考试之旅
  16. 鸿蒙系统PC具体配置要求,原神pc电脑配置多少 原神游戏最低配置一览
  17. 【高德地图POI踩坑】AMap.PlaceSearch无法使用
  18. 搭建mysql 主从复制The slave I/O thread stops because master and slave have equal MySQL server UUIDs
  19. 小米java模拟器_Android沉浸式简单实现(暂未测试全部机型,根据资料修改,模拟器,小米6,,荣耀做了简单测试)...
  20. Apache htaccess 重写如果文件存在!

热门文章

  1. 玖章算术CEO叶正盛在数据技术嘉年华分享NineData AIGC的应用实践
  2. python3 image模块安装,Docker image默认为Python3.6,即使我安装了Python3.7
  3. MySql(5)—— union、limit
  4. php小项目-登录和注册的实现
  5. 使用OpenSSL生成自签名证书和格式转换
  6. 智能电视TV开发---客户端和服务器通信
  7. Moco框架基础操作
  8. 哈工大 大数据算法 近似计数-morris算法
  9. php7 新特性整理
  10. 《审查指南》最新修改:无限分案bug修正、限缩公知常识的使用