本网站可以通过分类标签帮助你快速筛选出你想看的文章,记住地址:www.Facec.cc

golang银行卡号码的校验规则

银行卡号码的校验规则

银行卡号码的校验采用LUHN算法(模10算法),校验如下:
  1. 拿出卡号最后一位的校验位后,从右至左,将卡号按位编码,从0开始,判断偶数或奇数
  2. 判断逻辑--对每一位的计算规则:如果这一位是奇数位,则返回值本身,如果是偶数位,先将值乘以2得到一个数n,如果n是一位数(小于10),直接返回n,否则将n的个位数和十位数相加返回。
  3. 从右向左遍历,对每一位字符执行上面的判断逻辑,并将每一位的计算结果相加得到一个总数sum。
  4. 如果sum+校验位能够整除10,则此号码有效,否则号码无效。

// verifyBankCard 验证银行卡是否正确
func verifyBankCard(numStr string) bool {
	if len(numStr) > 19 || len(numStr) < 15 {
		return false // 银行卡号长度为15-19
	}

	lastNum, err := strconv.Atoi(string(numStr[len(numStr)-1])) // 取出最后一位--校验位
	if err != nil {
		return false
	}

	numStr = numStr[:len(numStr)-1] // 删除最后一个值
	runes := []rune(numStr)
	for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
		runes[i], runes[j] = runes[j], runes[i] // 变为数组再颠倒
	}

	sum := 0 // 总数
	for i, r := range runes {
		elem, err := strconv.Atoi(string(r))
		if err != nil {
			return false
		}

		if i%2 == 0 {
			n := elem * 2
			if n < 10 {
				sum += n
			} else {
				sum += (n / 10) + (n % 10)
			}
		} else {
			sum += elem
		}
	}

	return (sum+lastNum)%10 == 0
}

评论