android -- 校验公司营业执照代码
2017-10-26 本文已影响20人
喜欢书的女孩
- 最近有一个功能需求要求实现对用户输入的公司营业执照代码进行校验,在网上找了一篇写的不错的博客--参考源码博客,看了就直接拿过来用了,调试的时候报错了.
错误信息是
Exception in thread
"main"java.lang.StringIndexOutOfBoundsException
2017-10-26.png
- 错误的根源是str.charAt(c18) , c18此时的值是48,超出了str 的31的长度
if (str.charAt(c18) != codes[1].charAt(0)) {
System.out.println("公司营业执照代码有误! "+code);
return false;
}
- 修改,正确的代码
package cxy.six;
public class Linsence{
/**
* 营业执照注册号校验正确返回码
*/
private static String error_Businesslicense_Empty = "请输入营业执照注册号";
public static String error_Businesslicense = "您输入的营业执照注册号有误,请核对后再输!";
public static String error_Businesslicense_No = "您输入的营业执照注册号不足15位,请核对后再输!";
public static String test1 = "91460600MA5RC30P9Y"; // 营业执照号
public static String test2 = "913706871653058"; // 营业执照号
public static void main(String[] args) {
isLicense_18(test1);
isLicense_15(test2);
}
/**
* 校验 营业执照注册号
*
* @param businesslicense
* @return
*/
public static boolean isLicense_15(String businesslicense) {
if ("".equals(businesslicense) || " ".equals(businesslicense)) {
System.out.println(error_Businesslicense_Empty);
return false;
} else if (businesslicense.length() != 15) {
System.out.println(error_Businesslicense_No);
return false;
}
String businesslicensePrex14 = businesslicense.substring(0, 14);// 获取营业执照注册号前14位数字用来计算校验码
String businesslicense15 = businesslicense.substring(14, businesslicense.length());// 获取营业执照号的校验码
char[] chars = businesslicensePrex14.toCharArray();
int[] ints = new int[chars.length];
for (int i = 0; i < chars.length; i++) {
ints[i] = Integer.parseInt(String.valueOf(chars[i]));
}
getCheckCode(ints);
if (!businesslicense15.equals(getCheckCode(ints) + "")) {// 比较填写的营业执照注册号的校验码和计算的校验码是否一致
return false;
}
System.out.println(error_Businesslicense);
return true;
}
/**
* 获取 营业执照注册号的校验码
*
* @param ints
* @return
*/
private static int getCheckCode(int[] ints) {
if (null != ints && ints.length > 1) {
int ti = 0;
int si = 0; // pi|11+ti
int cj = 0; // (si||10==0?10:si||10)*2
int pj = 10; // pj=cj|11==0?10:cj|11
for (int i = 0; i < ints.length; i++) {
ti = ints[i];
pj = (cj % 11) == 0 ? 10 : (cj % 11);
si = pj + ti;
cj = (0 == si % 10 ? 10 : si % 10) * 2;
if (i == ints.length - 1) {
pj = (cj % 11) == 0 ? 10 : (cj % 11);
return pj == 1 ? 1 : 11 - pj;
}
}
}
return -1;
}
public static boolean isLicense_18(String code){
if (code.length() != 18) {
System.out.println(" 公司营业执照代码长度错误!"+code);
return false;
}
String regex = "^([159Y]{1})([1239]{1})([0-9ABCDEFGHJKLMNPQRTUWXY]{6})([0-9ABCDEFGHJKLMNPQRTUWXY]{9})([0-90-9ABCDEFGHJKLMNPQRTUWXY])$";
if (!code.matches(regex)) {
System.out.println("公司营业执照代码校验错误! "+code);
return false;
}
String str = "0123456789ABCDEFGHJKLMNPQRTUWXY"; //31个数
int[] ws = { 1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28 }; //17个数
String[] codes = new String[2];
codes[0] = code.substring(0, code.length() - 1); //从0到17个数
codes[1] = code.substring(code.length() - 1, code.length()); //第18位数
// System.out.println("code.length() "+codes[1].length());
int sum = 0;
for (int i = 0; i < 17; i++) {
sum += str.indexOf(codes[0].charAt(i)) * ws[i];
}
int c18 = 31 - (sum % 31);
// System.out.println("c18 "+c18);
if (c18 == 31) {
c18 = 'Y';
}
else if (c18 == 30) {
c18 = '0';
}
else if (str.charAt(c18) != codes[1].charAt(0)) {
System.out.println("公司营业执照代码有误! "+code);
return false;
}
return true;
}
}
- 感谢原作者的分享