Delphi-Projects
74 строки · 1.8 Кб
1unit BICLSKey;
2
3interface
4
5function CalcLSKey(const BIC, LS: string): Char;
6function CalcKSKey(const BIC, KS: string): Char;
7function ValidLSKey(const BIC, LS: string): Boolean;
8function ValidKSKey(const BIC, KS: string): Boolean;
9function IsRKC(const BIC: string): Boolean;
10
11implementation
12uses
13SysUtils, StrUtils;
14
15function InternalCalcLSKey(const BICLS: string): Char;
16var
17B: array[1..23] of Byte;
18I: Integer;
19Sum: Integer;
20begin
21for I := 1 to 23 do
22B[I] := Byte(BICLS[I]) - 48; //Asc('0')
23B[12] := 0; //default key = 0 for recalculation
24Sum := 0;
25for I := 1 to 23 do
26begin
27if (I mod 3) = 1 then
28Inc(Sum, B[I] * 7 mod 10)
29else if (I mod 3) = 2 then
30Inc(Sum, B[I] {* 1} mod 10)
31else {I mod 3 = 0}
32Inc(Sum, B[I] * 3 mod 10);
33end;
34Result := Char(Sum * 3 mod 10 + 48);
35end;
36
37function CalcLSKey(const BIC, LS: string): Char;
38begin
39if IsRKC(BIC) then
40Result := InternalCalcLSKey('0' + Copy(BIC, 5, 2) + LS)
41else
42Result := InternalCalcLSKey(Copy(BIC, 7, 3) + LS);
43end;
44
45function CalcKSKey(const BIC, KS: string): Char;
46begin
47if not IsRKC(BIC) then //inverted to LS
48Result := InternalCalcLSKey('0' + Copy(BIC, 5, 2) + KS)
49else
50Result := InternalCalcLSKey(Copy(BIC, 7, 3) + KS);
51end;
52
53function ValidLSKey(const BIC, LS: string): Boolean;
54begin
55if IsRKC(BIC) then
56Result := (InternalCalcLSKey('0' + Copy(BIC, 5, 2) + LS) = LS[9])
57else
58Result := (InternalCalcLSKey(Copy(BIC, 7, 3) + LS) = LS[9]);
59end;
60
61function ValidKSKey(const BIC, KS: string): Boolean;
62begin
63if not IsRKC(BIC) then
64Result := (InternalCalcLSKey('0' + Copy(BIC, 5, 2) + KS) = KS[9])
65else
66Result := (InternalCalcLSKey(Copy(BIC, 7, 3) + KS) = KS[9]);
67end;
68
69function IsRKC(const BIC: string): Boolean;
70begin
71Result := StrToInt(AnsiRightStr(BIC, 3)) < 5;
72end;
73
74end.
75