-
Notifications
You must be signed in to change notification settings - Fork 1
/
codigo-verificador-base10.swift
47 lines (47 loc) · 1.49 KB
/
codigo-verificador-base10.swift
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
45
46
47
/*
* Crear y validar números de longitud fija con algoritmo de Luhn
* @ToRo 2017
* https://tar.mx
* v1.2
*/
import Foundation
//MARK: padding izquierdo
extension String {
func left(total:Int, cadena: String) -> String {
let pad = total - self.characters.count;
return pad < 1 ? self : "".padding(toLength: pad, withPad: cadena, startingAt: 0)+self
}
}
//MARK: crear dígito
func digito(cadena:String) -> Int {
var sum = [Int](), a = 2, total = 0;
//multiplicamos
for i in cadena.characters {
let n = Int(String(i))
a = (a < 1) ? 2 : a //primer caracter *1, luego *2 y así.
sum.append(n!*a) // añadimos al arreglo
a -= 1
}
sum.reverse()
//sumamos
for numero in sum {
for chars in String(Int(numero)).characters {
let suma = Int(String(chars))
total += suma!
}
}
total %= 10 //base10
return (total != 0) ? 10-total : total
}
//MARK: ejemplo
let longitud = 5; //longitud de relleno de cada número
let prefijo = "01"; //prefijo número
let numeros = [37,92,10,20]; //números de ejemplo
for numero in numeros {
let original = String(numero)
let relleno = prefijo + original.left(total: longitud, cadena: "0")
let digitov = digito(cadena: relleno) //aquí obtiene el prefijo
let codigo = relleno + String(Int(digitov))
print("Final: \(codigo) Inicial: \(original) - Relleno \(relleno) Dígito verificador \(digitov)")
}
//EOF