学习go语言有一段时间了,最近公司要生成手机IMEI,在网上找了一下,没有合适的,决定弄一个。
IMEI校验码(最右一位)算法: IMEI有15位数,从右至左 (1).将偶数位数字分别乘以2,分别计算个位数和十位数之和 (2).将奇数位数字相加,再加上上一步算得的值 (3).如果得出的数个位是0则校验位为0,否则为10减去个位数 如:35 89 01 80 69 72 41 偶数位乘以2得到52=10 92=18 12=02 02=00 92=18 22=04 1*2=02,计算奇数位数字之和和偶数位个位十位之和,得到 3+(1+0)+8+(1+8)+0+(0+2)+8+(0+0)+6+(1+8)+7+(0+4)+4+(0+2)=63 => 校验位 10-3 = 7,则最后位为7,所以完整是358901806972417 代码如下:
package main
import (
"fmt"
"strconv"
)
func main() {
var start int = 86774106000000
for i := 0; i < 100; i++ { //生成100个IMEI
startStr := strconv.Itoa(start)
last := strconv.Itoa(imei(start))
fmt.Println(startStr + last)
start = start + 1
}
}
//求数字的个位数,十位数..之和,例:sum(18)=9
func sum(i int) int {
s := strconv.Itoa(i)
var sum int
for i := 0; i < len(s); i++ {
a := string(s[i])
b, _ := strconv.Atoi(a)
sum += b
}
return sum
}
//求数字的IMEI
func imei(i int) int {
startStr := fmt.Sprintf("%d", i)
var allSum, sum1, last int
for i := 0; i < len(startStr); i++ {
ch := startStr[i]
chStr := string(ch)
if i%2 == 0 {
chInt, _ := strconv.Atoi((chStr))
sum1 = chInt
} else {
chInt, _ := strconv.Atoi((chStr))
chIntDouble := chInt * 2
sum1 = sum(chIntDouble)
}
allSum = allSum + sum1
}
mod := allSum % 10
last = 10 - mod
if last == 10 {
last = 0
}
return last
}