判断数据中是否存在x位顺子
/**
* @Description: 设置字符,不少于number位,判断其中continueNumber位为连续自然数
* @param card
* @param number
* @param continueNumber
* @return true:符合连续自然数,false不符合
*/
public static boolean chech(String card, Integer number, Integer continueNumber) {
if (card.length() < number) {
return false;
}
char[] chars = card.toCharArray();
int beforeIndex = 0;
int afterIndex = 1;
char beforeChar = chars[beforeIndex];
char afterChar = chars[afterIndex];
while (true) {
if (afterIndex - beforeIndex == continueNumber) {
return true;
}
if (afterChar - beforeChar == 1) {
beforeChar = chars[afterIndex];
afterIndex = afterIndex + 1;
if (afterIndex == card.length()) {
return afterIndex - beforeIndex == continueNumber;
}
afterChar = chars[afterIndex];
} else {
if (card.length() - afterIndex < continueNumber) {
return false;
}
beforeIndex = afterIndex;
beforeChar = chars[beforeIndex];
afterIndex = afterIndex + 1;
afterChar = chars[afterIndex];
}
}
}
private String createOrdinaryCard(Long customerId) {
//查询数据库中卡号生成规则
MemberCardnumber memberCardnumber = memberCardnumberMapper.selectOne(new LambdaQueryWrapper<MemberCardnumber>()
.eq(MemberCardnumber::getCustomerId, customerId));
if (memberCardnumber == null) {
throw new BizException(BizResultCodeEnum.MEMBER_CARD_CONFIG_NOT_EXIST);
}
// 卡号位数
Integer cardNumbers = memberCardnumber.getCardnumbers();
// 卡号前缀
String cardNumberPrefix = Optional.ofNullable(memberCardnumber.getCardnumberPrefix()).orElse("");
// 卡号后缀
String cardNumberSuffix = Optional.ofNullable(memberCardnumber.getCardnumberSuffix()).orElse("");
int randomNum = cardNumbers - cardNumberPrefix.length() - cardNumberSuffix.length();
String cardNum = String.valueOf((int) ((Math.random() * 9 + 1) * Math.pow(10, randomNum - 1)));
while (!checkMemberCard(cardNum)) {
cardNum = String.valueOf((int) ((Math.random() * 9 + 1) * Math.pow(10, randomNum - 1)));
}
return StringUtils.join(cardNumberPrefix, cardNum, cardNumberSuffix);
}
注意在生成卡号时可能会出现超过int最大范围的情况。
/**
* 校验会员卡号是否是靓号
*
* @param cardNumber
* @return
*/
private boolean checkMemberCard(String cardNumber) {
long card = Long.parseLong(cardNumber);
// 前100位 0000001-000100
if (card >= 1 && card <= 100) {
return false;
// 51开头
} else if (cardNumber.startsWith("51")) {
return false;
} else if (checkCardSameEnd(cardNumber)) {
return false;
} else if (60017799 >= card && 60017701 <= card) {
return false;
} else if (chech(cardNumber)) {
return false;
} else {
return true;
}
}
/**
* 校验卡号末尾是否相同
* @param cardNumber
* @return
*/
private boolean checkCardSameEnd(String cardNumber) {
char endChar = cardNumber.charAt(cardNumber.length() - 1);
char beforeChar = cardNumber.charAt(cardNumber.length() - 1 - 1);
return endChar == beforeChar;
}