IBAN
12 отговора
851 прегледа
IBAN
Моля Ви да помогнета за изчисляване защитно число на IBAN на VBA
След като преобразувам IBAN-на от букви в цифри в IbanNow изчислявам защитното число така:
Dim IbanNow
If CDec(IbanNow - 97 * (Int(IbanNow / 97))) = 1 Then Вярно
Else грешно
За сметки на повечето банки изчислява вярно но за ПИБ на всички сметки дава грешно защитно число.Ето една сметка на ПИБ BG28FINV915010BGN04ANT
Помогнете къде греша.
Благодаря
След като преобразувам IBAN-на от букви в цифри в IbanNow изчислявам защитното число така:
Dim IbanNow
If CDec(IbanNow - 97 * (Int(IbanNow / 97))) = 1 Then Вярно
Else грешно
За сметки на повечето банки изчислява вярно но за ПИБ на всички сметки дава грешно защитно число.Ето една сметка на ПИБ BG28FINV915010BGN04ANT
Помогнете къде греша.
Благодаря
Re: IBAN
А тази функция CDec() какво трябва да върне? Защо сравняваш резултата с 1?
Щирлиц
Щирлиц
Re: IBAN
Функцията трябва да върне число,когато е единица защитното число е вярно,а друго грешно.Но аз открих друг готов код и се справих.
Re: IBAN
Аха. Може да провериш в другия (готов) код дали не се прави сравнение със самото защитно число (контролна сума).
Също така обикновено трябва да поглеждаш дали дадена функция не връща случайно "True" или "False". По стари стандарти - "True"=1, "False"=0, но!!?!?!? Във VB6 май се случва функцията да върне за "True" резултат "различен от нула", което в най-честия случай - е -1 (минус едно). "False" си е 0. Затова не си играй на догадки с подобни функции, и не пиши числата като величини за сравнение, ами използвай константите на компилатора.
Щирлиц
Също така обикновено трябва да поглеждаш дали дадена функция не връща случайно "True" или "False". По стари стандарти - "True"=1, "False"=0, но!!?!?!? Във VB6 май се случва функцията да върне за "True" резултат "различен от нула", което в най-честия случай - е -1 (минус едно). "False" си е 0. Затова не си играй на догадки с подобни функции, и не пиши числата като величини за сравнение, ами използвай константите на компилатора.
Щирлиц
Re: IBAN
Всъщност, ако не е комерсиално - постни кода за проверка на IBAN, да го имаме всички.
Щирлиц
Щирлиц
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
Ползвам го на 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
Не е
Една примерна функцийка с обяснения.Разбира се, трябва да се добавят и проверки за коректност на стринга.
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. Този е верен
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. Този е верен
Re: IBAN
Примера който си дал наистина е с невалидно контролно число. Дава остатък 2
[линк]
И тук така казват
[линк]
И тук така казват
Re: IBAN
Никъде не намерих подобно нещо и останавам с впечатлението, че не се прави валидация.
Re: IBAN
BIC-а се регистрира в SWIFT - те проверяват за уникалност и
повече не се контролира
повече не се контролира
Re: IBAN
IBAN-a , който даваш като пример наистина не е верен
верния е :
BG27FINV915010BGN04ANT
вервай ми ( работя в ПИБ )
верния е :
BG27FINV915010BGN04ANT
вервай ми ( работя в ПИБ )
Re: Не е
Понеже най-нагло смятам да направя rip off на този код, ето и моята cleaned up версия (за всички почитатели на new gamei VB6):
cheers,
</wqw>
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>