IBAN

12 отговора 851 прегледа
#1

IBAN

Моля Ви да помогнета за изчисляване защитно число на IBAN на VBA
След като преобразувам IBAN-на от букви в цифри в IbanNow изчислявам защитното число така:

Dim IbanNow
If CDec(IbanNow - 97 * (Int(IbanNow / 97))) = 1 Then Вярно
Else грешно

За сметки на повечето банки изчислява вярно но за ПИБ на всички сметки дава грешно защитно число.Ето една сметка на ПИБ BG28FINV915010BGN04ANT
Помогнете къде греша.
Благодаря

Отговор
в отговор на Chomi #2

Re: IBAN

А тази функция CDec() какво трябва да върне? Защо сравняваш резултата с 1?


Щирлиц
Отговор
в отговор на Щиpлиц #3

Re: IBAN

Функцията трябва да върне число,когато е единица защитното число е вярно,а друго грешно.Но аз открих друг готов код и се справих.

Отговор
в отговор на Chomi #4

Re: IBAN

Аха. Може да провериш в другия (готов) код дали не се прави сравнение със самото защитно число (контролна сума).

Също така обикновено трябва да поглеждаш дали дадена функция не връща случайно "True" или "False". По стари стандарти - "True"=1, "False"=0, но!!?!?!? Във VB6 май се случва функцията да върне за "True" резултат "различен от нула", което в най-честия случай - е -1 (минус едно). "False" си е 0. Затова не си играй на догадки с подобни функции, и не пиши числата като величини за сравнение, ами използвай константите на компилатора.


Щирлиц
Отговор
в отговор на Chomi #5

Re: IBAN

Всъщност, ако не е комерсиално - постни кода за проверка на IBAN, да го имаме всички.


Щирлиц
Отговор
в отговор на Chomi #6

Re: IBAN

Тъй като не съм програмист ако някой преработи кода IbanLat нека го пусне.
Ползвам го на VBA=

Function ProvIban(IBan As String) As Boolean
Dim Tempintiger As Long
Dim Tempstr As String
Dim Divstr As String
If IbanLat(IBan) = 0 Then
MsgBox "IBAN СЪДЪРЖА СИМВОЛ РАЗЛИЧЕН ОТ ПОЗВОЛЕНИТЕ", vbCritical
Exit Function
Else
End If
Tempstr = IbanLat(IBan)
Do Until Len(Tempstr) <= 5
Let Divstr = Left(Tempstr, 5)
If Len(Tempstr) > 5 Then
Let Tempstr = Right(Tempstr, Len(Tempstr) - 5)
End If
Let Tempintiger = Format(Divstr)
Let Tempstr = Str(Tempintiger Mod 97) + Tempstr
Loop

Let Tempintiger = Format(Tempstr)
If (Tempintiger Mod 97) = 1 Then
ProvIban = True
Else
ProvIban = False
End If
End Function



Function IbanLat(IBan As String) As String

Dim IbanNow
Dim Iban1(22) As String
Dim Lat(26)
Dim Lat1(26) As Double
Dim Ost As Integer
Dim IbanNow112

Lat(1) = "A"
Lat(2) = "B"
Lat(3) = "C"
Lat(4) = "D"
Lat(5) = "E"
Lat(6) = "F"
Lat(7) = "G"
Lat(8) = "H"
Lat(9) = "I"
Lat(10) = "J"
Lat(11) = "K"
Lat(12) = "L"
Lat(13) = "M"
Lat(14) = "N"
Lat(15) = "O"
Lat(16) = "P"
Lat(17) = "Q"
Lat(18) = "R"
Lat(19) = "S"
Lat(20) = "T"
Lat(21) = "U"
Lat(22) = "V"
Lat(23) = "W"
Lat(24) = "X"
Lat(25) = "Y"
Lat(26) = "Z"

Lat1(1) = 10
Lat1(2) = 11
Lat1(3) = 12
Lat1(4) = 13
Lat1(5) = 14
Lat1(6) = 15
Lat1(7) = 16
Lat1(8) = 17
Lat1(9) = 18
Lat1(10) = 19
Lat1(11) = 20
Lat1(12) = 21
Lat1(13) = 22
Lat1(14) = 23
Lat1(15) = 24
Lat1(16) = 25
Lat1(17) = 26
Lat1(18) = 27
Lat1(19) = 28
Lat1(20) = 29
Lat1(21) = 30
Lat1(22) = 31
Lat1(23) = 32
Lat1(24) = 33
Lat1(25) = 34
Lat1(26) = 35


IbanNow = Mid(IBan, 5, 18) & Mid(IBan, 1, 2) & Mid(IBan, 3, 2)

Iban1(1) = Mid(IbanNow, 1, 1)
Iban1(2) = Mid(IbanNow, 2, 1)
Iban1(3) = Mid(IbanNow, 3, 1)
Iban1(4) = Mid(IbanNow, 4, 1)
Iban1(5) = Mid(IbanNow, 5, 1)
Iban1(6) = Mid(IbanNow, 6, 1)
Iban1(7) = Mid(IbanNow, 7, 1)
Iban1(8) = Mid(IbanNow, 8, 1)
Iban1(9) = Mid(IbanNow, 9, 1)


Iban1(10) = Mid(IbanNow, 10, 1)
Iban1(11) = Mid(IbanNow, 11, 1)
Iban1(12) = Mid(IbanNow, 12, 1)
Iban1(13) = Mid(IbanNow, 13, 1)
Iban1(14) = Mid(IbanNow, 14, 1)
Iban1(15) = Mid(IbanNow, 15, 1)
Iban1(16) = Mid(IbanNow, 16, 1)
Iban1(17) = Mid(IbanNow, 17, 1)
Iban1(18) = Mid(IbanNow, 18, 1)
Iban1(19) = Mid(IbanNow, 19, 1)

Iban1(20) = Mid(IbanNow, 20, 1)
Iban1(21) = Mid(IbanNow, 21, 1)
Iban1(22) = Mid(IbanNow, 22, 1)



For I = 1 To 26
If Iban1(1) = Lat(I) Then Iban1(1) = Lat1(I)
Next
For I = 1 To 26
If Iban1(2) = Lat(I) Then Iban1(2) = Lat1(I)
Next
For I = 1 To 26
If Iban1(3) = Lat(I) Then Iban1(3) = Lat1(I)
Next
For I = 1 To 26
If Iban1(4) = Lat(I) Then Iban1(4) = Lat1(I)
Next
For I = 1 To 26
If Iban1(5) = Lat(I) Then Iban1(5) = Lat1(I)
Next
For I = 1 To 26
If Iban1(6) = Lat(I) Then Iban1(6) = Lat1(I)
Next
For I = 1 To 26
If Iban1(7) = Lat(I) Then Iban1(7) = Lat1(I)
Next
For I = 1 To 26
If Iban1(8) = Lat(I) Then Iban1(8) = Lat1(I)
Next
For I = 1 To 26
If Iban1(9) = Lat(I) Then Iban1(9) = Lat1(I)
Next
For I = 1 To 26
If Iban1(10) = Lat(I) Then Iban1(10) = Lat1(I)
Next
For I = 1 To 26
If Iban1(11) = Lat(I) Then Iban1(11) = Lat1(I)
Next
For I = 1 To 26
If Iban1(12) = Lat(I) Then Iban1(12) = Lat1(I)
Next
For I = 1 To 26
If Iban1(13) = Lat(I) Then Iban1(13) = Lat1(I)
Next
For I = 1 To 26
If Iban1(14) = Lat(I) Then Iban1(14) = Lat1(I)
Next
For I = 1 To 26
If Iban1(15) = Lat(I) Then Iban1(15) = Lat1(I)
Next
For I = 1 To 26
If Iban1(16) = Lat(I) Then Iban1(16) = Lat1(I)
Next
For I = 1 To 26
If Iban1(17) = Lat(I) Then Iban1(17) = Lat1(I)
Next
For I = 1 To 26
If Iban1(18) = Lat(I) Then Iban1(18) = Lat1(I)
Next
For I = 1 To 26
If Iban1(19) = Lat(I) Then Iban1(19) = Lat1(I)
Next
For I = 1 To 26
If Iban1(20) = Lat(I) Then Iban1(20) = Lat1(I)
Next
For I = 1 To 26
If Iban1(21) = Lat(I) Then Iban1(21) = Lat1(I)
Next
For I = 1 To 26
If Iban1(22) = Lat(I) Then Iban1(22) = Lat1(I)
Next

IbanNow = Iban1(1) & Iban1(2) & Iban1(3) & Iban1(4) & Iban1(5) & Iban1(6) & Iban1(7) & Iban1(8) & Iban1(9) & Iban1(10) & Iban1(11) & Iban1(12) _
& Iban1(13) & Iban1(14) & Iban1(15) & Iban1(16) & Iban1(17) & Iban1(18) & Iban1(19) & Iban1(20) & Iban1(21) & Iban1(22)

If Not IsNumeric(IbanNow) Then
IbanLat = 0
Exit Function

Else
End If

IbanLat = IbanNow

End Function

Отговор
в отговор на Щиpлиц #7

Не е

Една примерна функцийка с обяснения.Разбира се, трябва да се добавят и проверки за коректност на стринга.


Function ProvIban(ByVal IB As String) As Boolean
Dim IB1$, IB2$, i%, ch As String * 1, Ostatak%
'----------Първите 4 символа на IBAN се преместват най-отзад

IB1 = Right(IB, Len(IB) - 4) & Left(IB, 4)

'-------На получения стринг заменяме буквите с цифри - А=10, B=11 ...Z=35
IB2 = ""
For i = 1 To Len(IB1)
ch = Mid(IB1, i, 1)
IB2 = IB2 & IIf(IsNumeric(ch), ch, CStr(Asc(ch) - 55))
Next i

'------Полученото дълго число делим за остатък на 97. Понеже е много голямо не можем да го разделим нацяло, затова цифра по цифра (примерно).

Ostatak = 0
For i = 1 To Len(IB2)
Ostatak = (Ostatak * 10 + CByte(Mid(IB2, i, 1))) Mod 97
Next i
ProvIban = (Ostatak = 1)
End Function

Ако остатъка е 1, значи всичко е ок. Пример:
BG33AAAA12311012345678 - местим първите 4 отзад става
AAAA12311012345678BG33 - буквите в цифри:
1010101012311012345678111633
Делим за остатък на 97 и се получава 1. Този е верен

Отговор
в отговор на Chomi #8

Re: IBAN

Примера който си дал наистина е с невалидно контролно число. Дава остатък 2
[линк]
И тук така казват

Отговор
в отговор на Пaлячo #9

Re: IBAN

Ок, това работи.

А формулата за смятане на BIC има ли я някой?


Щирлиц
Отговор
в отговор на Щиpлиц #10

Re: IBAN

Никъде не намерих подобно нещо и останавам с впечатлението, че не се прави валидация.

Отговор
в отговор на Zarev #11

Re: IBAN

BIC-а се регистрира в SWIFT - те проверяват за уникалност и
повече не се контролира

Отговор
в отговор на Chomi #12

Re: IBAN

IBAN-a , който даваш като пример наистина не е верен
верния е :

BG27FINV915010BGN04ANT

вервай ми ( работя в ПИБ )

Отговор
в отговор на Пaлячo #13

Re: Не е

Понеже най-нагло смятам да направя rip off на този код, ето и моята cleaned up версия (за всички почитатели на new gamei VB6):
Function CheckIban(ByVal sIban As String) As Boolean

Dim sIbanRev As String
Dim sIbanDig As String
Dim lIdx As Long
Dim sChar As String
Dim lRem As Long

'--- "massage" input iban
sIbanRev = Replace(UCase(Mid$(sIban, 5) & Left$(sIban, 4)), " ", "")
'--- convert to digits
For lIdx = 1 To Len(sIbanRev)
sChar = Mid(sIbanRev, lIdx, 1)
'--- if invalid symbols -> bail out
If Not (Asc(sChar) >= Asc("A") And Asc(sChar) <= Asc("Z")) _
And Not IsNumeric(sChar) Then
Exit Function
End If
'--- convert "A".."Z" -> "10".."35"
sIbanDig = sIbanDig & IIf(IsNumeric(sChar), sChar, Asc(sChar) - Asc("A") + 10)
Next
'--- calc modulo
For lIdx = 1 To Len(sIbanDig)
lRem = (lRem * 10 + CLng(Mid(sIbanDig, lIdx, 1))) Mod 97
Next
'--- success (or failure)
CheckIban = (lRem = 1)
End Function

cheers,
</wqw>

Отговор