Obliczanie sumy kontrolnej numeru karty kredytowej oraz numeru banku
Bełdzio
W tym artykule postaram się przedstawić Wam sposób na obliczanie sum kontrolnych dla numeru karty kredytowej oraz numeru banku.
Suma kontrolna dla karty kredytowej.
Przedstawiony tutaj sposób nie różni się niczym od sposobów opisywanych przez Twardego wystarczy zmienić tylko wagi.
WAGI : 2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1
Powinno być 16 tych cyferek, ponieważ tyle ma numer karty, jeżeli posiadany przez Ciebie numer jest krótszy musisz dodać na jego początku zera tak, aby jego długość była równa 16.
Zastosowanie
-
Mnożymy kolejne cyfry numeru karty przez wagi np.
5694513500001252 -- numer karty
- 2121212121212121 -- wagi
10|6|18|4|10|1|6|5|0|0|0|0|2|2|10|2
- Sumujemy wyniki otrzymany w podpunkcie 1. Jeżeli iloczyn był większy od 9 to rozbijamy go na 2 liczby}.
1+0+6+1+8+4+1+0+1+6+5+0+0+0+0+2+2+1+0+2 = 40
- Wynik otrzymany w podpunkcie 2. dzielimy modulo 10
40 mod 10 = 0
Jeżeli otrzymaną liczbą jest 0 to znaczy, że numer jest poprawny
Suma kontrolna dla numeru banku
Zasada obliczani sumy kontrolnej jest prawie identyczne jak w przypadku numeru karty.
WAGI: 7,1,3,9,7,11,3
Zastosowanie
-
- Mnożymy kolejne cyfry numeru karty przez wagi np.
33142 0 1 (0) -- numer banku
- 71397113 -- wagi
21|3|3|36|14|0|3
- Sumujemy wyniki otrzymany w podpunkcie 1.
21+3+3+36+14+0+3 = 80
- Wynik otrzymany w podpunkcie 2. dzielimy modulo 10
80 mod 10 = 0
Jeżeli wynik równy jest liczbie kontrolnej to numer banku jest poprawny.
Suma kontrolna dla numeru bankowego IBAN
IBAN (International Bank Account Number) ? norma ISO-13616 wprowadzona w celu weryfikacji numerów kont bankowych.
Na numer IBAN składa się z dwuliterowego kudu państwa, dwucyfrowej sumy kontrolnej oraz numeru konta.
Weryfikacja numeru
Numer wyjściowy ? BE62 5100 0754 7061
-
Usunięcie znaków specjalnych z numery (spacje, myślniki) | BE6251000754 7061|
-
Przesunięcie kodu państwa oraz sumy kontrolnej na koniec (pierwsze 4 znaki)
|51000754 7061BE62| -
Zamiana liter na cyfry. A=10 B=11 C=12 ? Z=35 |51000754 7061111462|
-
Dzielimy modulo 97
51000754 7061111462 mod 97 = 1
Wyliczanie sum kontrolnych
-
Sumę kontrolną (3 i 4 znak) zastąp dwoma zerami ) | BE0051000754 7061|
-
Zamiana liter na cyfry. A=10 B=11 C=12 ? Z=35 |510007547061111400|
-
Dzielimy modulo 97
510007547061111400 mod 97 = 36
- Odejmij wynik z punktu 3. od 98
98 ? 36 = 62 -- suma kontrolna
Jeśli wynik jest jednocyfrowy trzeba dodać przed nim 0
Bonus ;)
Aby uniknąć dzielenia takich dużych liczb możemy rozbić je nam mniejsze. np.
510007547061111400 rozbijamy na 510007547 i 061111400
510007547 mod 97 = 74
Otrzymaną liczbę dopisujemy na początku drugiej liczby i wykonujemy ponownie dzielenie
74061111400 mod 97 = 36
Jako wynik otrzymaliśmy to samo, co w wyniku dzielenia
510007547061111400 mod 97 = 36
function IsValidIBAN(const IBAN: string): Boolean;
// http://www.ecbs.org/Download/EBS204_V3.2.pdf
function mod97(const number: string): integer;
var
x: longint;
l: integer;
t: string;
begin
x := 0;
t := number;
l := Length(t);
while (l > 2) do // maximum length of mod 97 string
begin
x := StrToInt(copy(t, 1, 9)) mod 97;
t := IntToStr(x)+copy(t, 10, l);
l := Length(t);
end;
result := x;
end;
function A2N(const c: char): string; // alpha to numeric conversion
begin
result := IntToStr(Ord(UpCase(c))-Ord('A')+10);
end;
const
IBANDigits = ['0'..'9'];
IBANLetters = [ 'a'..'z', 'A'..'Z'];
IBANCharacters = IBANDigits + IBANLetters;
var
Part1, Part2: string;
EndPtr, CurPtr, Counter: integer;
begin
EndPtr := Length(IBAN);
CurPtr := 1;
Counter := 0;
while CurPtr <= EndPtr do
begin
if IBAN[CurPtr] in IBANCharacters then
begin
if Counter < 4 then
begin
if IBAN[CurPtr] in IBANLetters then
Part1 := Part1 + A2N(IBAN[CurPtr])
else
Part1 := Part1 + IBAN[CurPtr];
end
else
begin
if IBAN[CurPtr] in IBANLetters then
Part2 := Part2 + A2N(IBAN[CurPtr])
else
Part2 := Part2 + IBAN[CurPtr];
end;
inc(Counter);
end;
inc(CurPtr);
end;
result := mod97(Part2+Part1) = 1;
end;
Zero formatowania przez co tekst sie dłuży i jest mało przejrzysty.