社会统一信用代码和数字转换

This commit is contained in:
刘伟龙 2020-03-19 08:47:25 +08:00
parent d330c489b3
commit 1ee8b79248
3 changed files with 62 additions and 1 deletions

View File

@ -1,12 +1,14 @@
package cn.hutool.core.lang;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import cn.hutool.core.util.ReUtil;
/**
* 常用正则表达式集合
*
*
* @author Looly
*
*/
@ -65,6 +67,20 @@ public class PatternPool {
"([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领]\\d{3}\\d{1,3}[领])|" +
"([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$");
/** 社会统一信用代码 */
public static final String REGEX = "^[A-Z0-9]{18}$";
public static final String BASE_CODE_STRING = "0123456789ABCDEFGHJKLMNPQRTUWXY";
public static final String BASE_CODE_REGEX = "[" + BASE_CODE_STRING + "]{18}";
public static final List<Character> BASE_CODES = new ArrayList<>();
public static final int[] WEIGHT = {1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28};
public static final char[] BASE_CODE_ARRAY = BASE_CODE_STRING.toCharArray();
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------
/** Pattern池 */
private static final SimpleCache<RegexWithFlag, Pattern> POOL = new SimpleCache<>();

View File

@ -1103,4 +1103,39 @@ public class Validator {
throw new ValidateException(errorMsg);
}
}
/**
* 简单校验统一社会信用代码
* 18位大写字母+数字
*
* @param creditCode 统一社会信用代码
* @return 校验结果
*/
public static boolean isCreditCodeBySimple(String creditCode) {
if (StrUtil.isBlank(creditCode)) {
return false;
}
return Pattern.matches(PatternPool.REGEX, creditCode);
}
/**
* 是否是有效的统一社会信用代码
*
* @param creditCode 统一社会信用代码
* @return 校验结果
*/
public static boolean isCreditCode(String creditCode) {
if (StrUtil.isBlank(creditCode) || !Pattern.matches(PatternPool.BASE_CODE_REGEX, creditCode)) {
return false;
}
char[] businessCodeArray = creditCode.toCharArray();
char check = businessCodeArray[17];
int sum = 0, length = 17;
for (int i = 0; i < length; i++) {
char key = businessCodeArray[i];
sum += (PatternPool.BASE_CODES.indexOf(key) * PatternPool.WEIGHT[i]);
}
int value = 31 - sum % 31;
return check == PatternPool.BASE_CODE_ARRAY[value % 31];
}
}

View File

@ -76,4 +76,14 @@ public class MathUtil {
public static List<String[]> combinationSelect(String[] datas, int m) {
return new Combination(datas).select(m);
}
/**
* 将当前数字转换为几位数字不足前面补0
* @param number 要转换的数字
* @param count 转换为几位数不足前面补0
* @return 转换后的数字
*/
public static String convertNumToDigitString( int number,int count) {
return String.format("%"+count+"d", number).replace(" ", "0");//5代表总共是几位数
}
}