Java验证统一社会信用代码

import org.apache.commons.lang.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * 统一社会信用代码有效性校验
 *
 */
public class TyshxydmVerificationUtil {
	public final static String ISTYSHXYDM = "true";
	public final static String ERROR_TYSHXYDM = "统一社会信用代码有误,请核对后再输入!";
	public final static String ERROR_TYSHXYDM_MIN = "统一社会信用代码不足18位,请核对后再输入!";
	public final static String ERROR_TYSHXYDM_MAX = "统一社会信用代码大于18位,请核对后再输入!";
	public final static String ERROR_TYSHXYDM_EMPTY ="统一社会信用代码不能为空!";
	private static Map<String,Integer> datas = null;
	static int[] power = {1,3,9,27,19,26,16,17,20,29,25,13,8,24,10,30,28};
	// 社会统一信用代码不含(I、O、S、V、Z) 等字母
	static char[] code = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','T','U','W','X','Y'};
	static {
		datas = new HashMap<>();
		for(int i=0;i<code.length;i++){
			datas.put(code[i]+"",i);
		}
	}
	
	/**
	 * 判断是否是一个有效的统一社会信用代码
	 * @param tyshxydm
	 * @return
	 */
	public static String isTyshxydm(String tyshxydm){
		if(StringUtils.isEmpty(tyshxydm) || StringUtils.isEmpty(tyshxydm.trim())){
			return ERROR_TYSHXYDM_EMPTY;
		}else if(tyshxydm.trim().length()<18){
			return ERROR_TYSHXYDM_MIN;
		}else if(tyshxydm.trim().length()>18){
			return ERROR_TYSHXYDM_MAX;
		}else if(tyshxydm.equals("000000000000000000")){
			return ERROR_TYSHXYDM;
		}else if(tyshxydm.startsWith("2")){
			return ERROR_TYSHXYDM;
		}else{
			tyshxydm = tyshxydm.trim();
			String checkCharResult = checkChar(tyshxydm); // 校验字符合法性
			if (!StringUtils.isEmpty(checkCharResult)) {
				return checkCharResult;
			}
			int sum = sum(tyshxydm.substring(0,17).toCharArray());
			int temp = sum%31;
			temp = temp==0?31:temp;
			return tyshxydm.substring(17,18).equals(code[31-temp]+"")?ISTYSHXYDM:ERROR_TYSHXYDM;
		}
	}
 
	private static String checkChar(String tyshxydm){
		String result = StringUtils.EMPTY;
		char[] chars = tyshxydm.toCharArray();
		for(int i = 0; i < chars.length; i++){
			if (Character.isSpaceChar(chars[i]) || !datas.containsKey(chars[i]+"")) {
				result = ERROR_TYSHXYDM;
				break;
			}
		}
		return result;
	}
	
	/**
	 * 加权计算
	 * @param chars
	 * @return
	 */
	private static int sum(char[] chars){
		int sum = 0;
		for(int i=0;i<chars.length;i++){
			int code = datas.get(chars[i]+"");
			sum += power[i]*code;
		}
		return sum;
 
	}
	
	
	public static void main(String[] args) {
		System.out.println(isTyshxydm("91220524MA84KJU9N"));
	}
	
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值