-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathisean.go
44 lines (38 loc) · 962 Bytes
/
isean.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package validatorgo
import (
"strconv"
)
// IsEAN checks if the string is a valid [EAN] (European Article Number).
//
// ok := validatorgo.IsDecimal("4006381333931")
// fmt.Println(ok) // true
// ok := validatorgo.IsDecimal("123456789012")
// fmt.Println(ok) // false
//
// [EAN]: https://en.wikipedia.org/wiki/International_Article_Number
func IsEAN(str string) bool {
length := len(str)
if length != 8 && length != 13 {
return false
}
// Check if all characters are digits
for _, r := range str {
if r < '0' || r > '9' {
return false
}
}
// Calculate checksum
var sum int
for i, r := range str[:length-1] {
digit, _ := strconv.Atoi(string(r))
if (length == 8 && i%2 == 0) || (length == 13 && i%2 != 0) {
sum += digit * 3
} else {
sum += digit
}
}
// The checksum digit is the last digit of the EAN
checksum := (10 - (sum % 10)) % 10
lastDigit, _ := strconv.Atoi(string(str[length-1]))
return checksum == lastDigit
}