package luhn import "unicode" func normalize(s string) string { var r []rune for _, v := range s { if unicode.IsNumber(v) { r = append(r, v) } } return string(r) } func chksum(s string) int { var sum int for i, v := range s { n := int(v - '0') if (len(s)-i)%2 == 0 { n *= 2 if n > 9 { n -= 9 } } sum += n } return sum } func Valid(s string) bool { s = normalize(s) if len(s) == 0 { return false } return chksum(s)%10 == 0 } func AddCheck(s string) string { sum := chksum(normalize(s + "9")) n := 9 - sum%10 return s + string('0'+rune(n)) }