validators/cnpj/lib.go

70 lines
1.1 KiB
Go
Raw Permalink Normal View History

2021-09-30 01:04:43 +00:00
package cnpj
import (
"strconv"
"unicode"
)
//Gets a string and formats is as CPF
func Format(s string) string {
raw := Strip(s)
ret := raw[0:2] + "." + raw[2:5] + "." + raw[5:8] + "/" + raw[8:12] + "-" + raw[12:14]
return ret
}
//Removes all non-digit symbols
func Strip(s string) string {
ret := ""
for _, v := range s {
if unicode.IsDigit(v) {
ret = ret + string(v)
}
}
return ret
}
//Checks if verification digit are respected
func Check(s string) bool {
raw := Strip(s)
nums := make([]int, 0)
for _, v := range raw {
i, _ := strconv.Atoi(string(v))
nums = append(nums, i)
}
d1 := 0
mul := 5
for _, v := range nums[0 : len(nums)-2] {
d1 = d1 + (v * mul)
mul--
2021-09-30 01:16:31 +00:00
if mul == 1 {
2021-09-30 01:04:43 +00:00
mul = 9
}
}
2021-09-30 01:16:31 +00:00
mod1 := ((d1) % 11)
if mod1 < 2 {
2021-09-30 01:04:43 +00:00
mod1 = 0
2021-09-30 01:16:31 +00:00
} else {
mod1 = 11 - mod1
2021-09-30 01:04:43 +00:00
}
d2 := 0
mul = 6
for _, v := range nums[0 : len(nums)-2] {
d2 = d2 + (v * mul)
mul--
2021-09-30 01:16:31 +00:00
if mul == 1 {
2021-09-30 01:04:43 +00:00
mul = 9
}
}
d2 = d2 + (mod1 * mul)
2021-09-30 01:16:31 +00:00
mod2 := (d2) % 11
if mod2 < 2 {
2021-09-30 01:04:43 +00:00
mod2 = 0
2021-09-30 01:16:31 +00:00
} else {
mod2 = 11 - mod2
2021-09-30 01:04:43 +00:00
}
return mod1 == nums[len(nums)-2] && mod2 == nums[len(nums)-1]
}