因为票据系统对子票区间的管理非常严格,但是为了兼容各大系统传送过来不同格式的数据,所以要做一个简单的处理!
1、当知道传入数据一定携带“-”时,可以直接使用split对字符串进行拆分
split 拆分字符串
@Test
public void test10(){
String rangNo = "123456-3654123";
//拆分
String[] split = rangNo.split("-");
//String类型
String begin = split[0];
String end = split[1];
//转int
int intBegin = Integer.parseInt(begin);
int intEnd = Integer.parseInt(end);
//补位
String formatBegin = String.format("%012d", intBegin);//只能识别int类型,所以需要转换
String format = String.format("%012d", intEnd);
System.out.println(formatBegin+"**************8"+format);
}
2、如果不确定收到的参数是什么类型,需做兼容处理
contains 集合中是否包含某字符串
indexOf 查询字符串在第几位
substring 字符串截取(截取时要注意包前不包后)
@Test
public void test11(){
String rangNo = "123-321";
//判空
if (StringUtils.isNullOrEmpty(rangNo)){
//判断是否带“-”
boolean contains = rangNo.contains("-");
if (contains){
//判断“-”在第几位
int i = rangNo.indexOf("-");
//分段获取
String substringBegin = rangNo.substring(0, i);//截取前半部分
String substringEnd = rangNo.substring(i + 1);//截取后半部分
//补位
String formatBegin = String.format("%012d", Integer.parseInt(substringBegin));//只能识别int类型,所以需要转换
String formatEnd = String.format("%012d", Integer.parseInt(substringEnd));
System.out.println(formatBegin+"********"+formatEnd);
List<String> rangList = new ArrayList<>();
rangList.add(formatBegin);
rangList.add(formatEnd);
return;
}
}
}
注意:Integer是有长度限制的,当时小编在写这个工具类时没考虑到最大值问题,所以代码还有一个很明显的bug,应用实际最重要,结合场景去完善功能吧!!!!!
java int 类整数的最大值是 2 的 31 次方 - 1 = 2147483648 - 1 = 2147483647
可以用 Integer.MAX_VALUE 表示它,即 int value = Integer.MAX_VALUE;
Integer.MAX_VALUE + 1 = Integer.MIN_VALUE = -2147483648
再大的数就要用 long (最大值 2 的 63 次方 - 1 )或者 BigDecimal 表示
提取新增Utils方法
package cn.bankapp.ecds.custom.tranServerOld.util;
import cn.bankapp.ecds.common.exception.CheckException;
import cn.bankapp.ecds.common.exception.ErrorCode;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang.StringUtils;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName RangeNoInspectUntils
* @Description TODO
* @Author WYD
* @Date 2022/7/19 17:45
* @Version 1.0
*/
@Log4j2
public class RangeNoInspectUntils {
/**
* 票据区间拆分
*
* @param rangeNo 子区间号
* @param beginRangeNo 开始区间
* @param endRangeNo 结束区间
* @throws Exception
*/
public List<String> rangeNo(String rangeNo, String beginRangeNo, String endRangeNo) throws Exception {
if (StringUtils.isBlank(rangeNo) && StringUtils.isBlank(beginRangeNo) && StringUtils.isBlank(endRangeNo)) {
throw new CheckException(ErrorCode.PARAM_NULL, "‘子区间号’或‘起始子区间-结束子区间’至少有一个不能为空");
}
String beginRangeNoNew;
String endRangeNoNew;
if (StringUtils.isNotEmpty(rangeNo)) {
boolean containsRangeNo = rangeNo.contains("-");
if (containsRangeNo) {
log.info("-----------子票区间{}-----------", rangeNo);
//wyd 20220505 拆分
String[] str = rangeNo.split("-");
String begin = str[0];
String end = str[1];
if ("0".equals(begin) && "0".equals(end)) {
beginRangeNoNew = begin;
endRangeNoNew = end;
} else {
//获取截取到的参数
int beginNo = Integer.parseInt(begin);
int endNo = Integer.parseInt(end);
//数据不够12位进行补齐
beginRangeNoNew = String.format("%012d", beginNo);
endRangeNoNew = String.format("%012d", endNo);
}
}else {
if ("0".equals(rangeNo)){
beginRangeNoNew = "0";
endRangeNoNew = "0";
}else {
log.info("票据区间不存在");
throw new Exception("票据区间不存在");
}
}
} else {
log.info("-----------起始区间{}-结束区间{}-----------", beginRangeNo, endRangeNo);
String rangeNo1 = null;
if (StringUtils.isNotBlank(beginRangeNo)) {
rangeNo1 = beginRangeNo;
} else {
rangeNo1 = endRangeNo;
}
boolean containsBeginRangeNo = rangeNo1.contains("-");
if (containsBeginRangeNo) {
log.info("----------进入containsBeginRangeNo方法{}----------------", containsBeginRangeNo);
int i1 = rangeNo1.indexOf("-");
String beginNo = rangeNo1.substring(0, i1);
String endNo = rangeNo1.substring(i1 + 1);
if ("0".equals(beginNo) && "0".equals(endNo)) {
log.info("----------等分化不可拆分票--------------");
beginRangeNoNew = beginNo;
endRangeNoNew = endNo;
} else {
log.info("----------等分化可拆分票--------------");
//数据不够12位进行补齐
beginRangeNoNew = String.format("%012d", Integer.parseInt(beginNo));
endRangeNoNew = String.format("%012d", Integer.parseInt(endNo));
}
} else {
log.info("----------未进入containsBeginRangeNo方法{}----------------", containsBeginRangeNo);
if ("0".equals(beginRangeNo) && "0".equals(endRangeNo)) {
log.info("----------等分化不可拆分票{}{}--------------", beginRangeNo, endRangeNo);
beginRangeNoNew = beginRangeNo;
endRangeNoNew = endRangeNo;
} else {
log.info("----------等分化可拆分票{},{}--------------", beginRangeNo, endRangeNo);
//数据不够12位进行补齐
beginRangeNoNew = String.format("%012d", Integer.parseInt(beginRangeNo));
endRangeNoNew = String.format("%012d", Integer.parseInt(endRangeNo));
}
}
}
List<String> rangeNoList = new ArrayList<>();
rangeNoList.add(beginRangeNoNew);
rangeNoList.add(endRangeNoNew);
log.info("区间号{},{}",beginRangeNoNew,endRangeNoNew);
return rangeNoList;
}
/**
* @return void
* 测试
* @Author WYD
* @Description //TODO
* @Date 2022/7/19
* @Param [args]
* @Version 1.0
**/
public static void main(String[] args) throws Exception {
String billNo = "62312313"; // 票号
String subString = billNo.substring(0, 1);
System.out.println(subString);
//区间
//等分化票可拆分
if ("5".equals(subString) || "6".equals(subString)) {
List<String> strings = new RangeNoInspectUntils().rangeNo("0", null, null);
System.out.println(strings.get(0));
System.out.println(strings.get(1));
} else {
//传统票区间默认为12个0
System.out.println(String.format("%012d", Integer.parseInt("0"))); // 起始区间
System.out.println(String.format("%012d", Integer.parseInt("0"))); // 结束区间
}
}
}