:: Архив конференции по VFP до 2005 года
Re: Может кто знает что егто такое
Петров Андрей
Автор

Сообщений: 2506
Откуда: Химки (М.О.)
Дата регистрации: 17.04.2002
Фуф вроде перевел под VFP но чего то оно не пашет. Те приведенный на сайте IBAN некорректен говорит...

Вот код.

CLEAR
IF CheckIBAN('AT61 1904 3002 3457 3201')
? 'OK'
ELSE
? 'IBAN IS NOT CORRECT'
ENDIF
FUNCTION CheckIBAN
LPARAMETERS x
&& all-in-one check on lower text box.
&& Any blank spaces are removed before the check is done
&& nError indicates which error message or combination of messages to display
m.someError = .f.
m.errMsg=""
DIMENSION st(4)
m.x=UPPER(m.x)
m.x=RemoveBlanks(m.x)
st[1] = SUBSTR(m.x,1,2)
m.countryCode=st[1]
st[2] = SUBSTR(m.x,3,2)
st[3] = SUBSTR(m.x,5,4)
st[4] = SUBSTR(m.x,9)
m.sCheck=st[3]+st[4]+st[1]+st[2]
IF !ALPHA(st[1])
m.someError=.t.
m.errMsg = "The first two characters must be alphabetic"+CHR(13)
ENDIF
IF !DIGIT(st[2])
m.someError=.t.
m.errMsg = m.errMsg + "Characters 3 and 4 must be numeric"+CHR(13)
ENDIF
IF !AlphNum(sCheck)
m.someError=.t.
m.errMsg =m.errMsg+"Only letters A-Z and numbers 0-9 are allowable"+CHR(13)
ENDIF
IF countryCode=="GB"
IF !ISALPHA(st[3])
m.someError=.t.
m.errMsg =m.errMsg+"If the country code is GB, characters 5-8 must be alphabetic"+CHR(13)
ENDIF
IF LEN(sCheck)#22
m.someError=.t.
m.errMsg =m.errMsg+"If the country code is GB, the IBAN must have 22 characters"+CHR(13)
ENDIF
ENDIF
IF !checkDigitSum(sCheck)
m.someError=.t.
m.errMsg =m.errMsg+"Checksum of IBAN is invalid"+CHR(13)
ENDIF
IF m.someError
=MESSAGEBOX("The format of the IBAN is incorrect"+CHR(13) + errMsg)
RETURN .f.
ENDIF
RETURN .t.
FUNCTION RemoveBlanks
LPARAMETERS str
PRIVATE r,x,c
m.r=''
FOR m.x=1 TO LEN(m.str)
m.c=SUBSTR(m.str,m.x,1)
IF m.c#' '
m.r=m.r+SUBSTR(m.str,m.x,1)
ENDIF
ENDFOR
RETURN m.r
FUNCTION Alpha
LPARAMETERS str
PRIVATE x,c
FOR m.x=1 TO LEN(m.str)
m.c=SUBSTR(m.str,m.x,1)
IF !ISALPHA(m.c)
RETURN .f.
ENDIF
ENDFOR
RETURN .t.
FUNCTION Digit
LPARAMETERS str
PRIVATE x,c
FOR m.x=1 TO LEN(m.str)
m.c=SUBSTR(m.str,m.x,1)
IF !ISDIGIT(m.c)
RETURN .f.
ENDIF
ENDFOR
RETURN .t.
FUNCTION AlphNum
LPARAMETERS str
PRIVATE x,c
FOR m.x=1 TO LEN(m.str)
m.c=SUBSTR(m.str,m.x,1)
IF !ISDIGIT(m.c) AND !ISALPHA(m.c)
RETURN .f.
ENDIF
ENDFOR
RETURN .t.
FUNCTION checkDigitSum
LPARAMETERS s
&& replace each letter by numerical equivalent to create new string newS
PRIVATE n,news,i,a,n,newm,r
m.newS = ""
FOR i = 1 TO LEN(s)
m.a = ASC(SUBSTR(m.s,m.i,1))
IF (a>=65) AND (a<=90)
m.n = m.a - 55
ELSE
m.n = VAL(SUBSTR(m.s,m.i,1))
ENDIF
m.newS = m.newS + ALLTRIM(STR(m.n))
ENDFOR
&& check digit sum by long division, starting with first two digits
m.newM=VAL(SUBSTR(m.newS,1,2))
m.r=MOD(m.newM,97)
FOR m.i = 3 TO LEN(m.news)
m.newM = 10*m.r + VAL(SUBSTR(m.newS,m.i,m.i+1))
m.r=MOD(m.newM,97)
ENDFOR
RETURN m.r=1




------------------
PS Недочитал тему до конца...
Ratings: 0 negative/0 positive
Re: Может кто знает что егто такое
Петров Андрей
Автор

Сообщений: 2506
Откуда: Химки (М.О.)
Дата регистрации: 17.04.2002
А вот выжимка со странички (Java)

Цитата:
function checkLowerBox() { // all-in-one check on lower text box.
// Any blank spaces are removed before the check is done
// nError indicates which error message or combination of messages to display
var someError = false
var errMsg =""
var st = new Array()
var x = document.form1.d0.value
x=x.toUpperCase()
document.form1.d0.value=x
x=noBlanks(x)
st[0] = x.substring(0,2)
countryCode=st[0]
st[1] = x.substring(2,4)
st[2] = x.substring(4,8)
st[3] = x.substring(8,x.length)
sCheck=st[2] + st[3] + st[0] +st[1]

if(!alph(st[0])) {someError=true; errMsg = "\nThe first two characters must be alphabetic"}
if(!num(st[1])) {someError=true; errMsg +="\nCharacters 3 and 4 must be numeric"}
if(!alphnum(sCheck)) {someError=true; errMsg +="\nOnly letters A-Z and numbers 0-9 are allowable"}
if(countryCode=="GB"){ if(!alph(st[2])) {someError=true; errMsg +="\nIf the country code is GB, characters 5-8 must be alphabetic"}
gbLength = sCheck.length
if(gbLength!=22) {someError=true; errMsg +="\nIf the country code is GB, the IBAN must have 22 characters"}
}
if(!someError) {checkDigitSum(sCheck)}
else {alert("The format of the IBAN is incorrect\n" + errMsg)}
}

function checkDigitSum(s) {// replace each letter by numerical equivalent to create new string newS
var n
newS = ""
for (var i = 0; i<s.length; ++i ) {
var a = s.charCodeAt(i)
if (a>=65 & a<=90) {n = a - 55}
else {n = s.charAt(i)}
newS = newS + n }
// check digit sum by long division, starting with first two digits
var newM = parseInt(newS.substring(0,2),10)
var r = newM % 97
for (i = 2; i <newS.length; ++i) {
newM = 10*r + parseInt(newS.substring(i, i+1),10)
r = newM % 97}
if (r==1) {document.imgCheck.src="checked.gif"; document.imgResult.src="resultOK.gif"}
else {document.imgCheck.src="checked.gif"; document.imgResult.src="resultNo.gif"}
}
function noBlanks(x) { // remove blanks from text in lower box before checking
var newX=""
for (var i=0; i<x.length;++i) {if(x.charAt(i)!=" ") newX=newX+x.charAt(i) }
return newX
}
function alph(x) { // Check if each character in string x is A-Z
var xNew=x.toUpperCase()
for (var i=0; i<xNew.length; ++i ) { var a = xNew.charCodeAt(i)
if (a<65 || a>90) return false }
return true
}
function num(x) { // Check if each character in string x is 0 - 9
for (var i=0; i<x.length; ++i ) { var a = x.charCodeAt(i)
if ( a<48 || a>57 ) {return false} }
return true
}
function alphnum(x) { // check if each character in string x is A-Z or 0-9
for (var i=0; i<x.length; ++i ) { var c = x.charAt(i)
if (!alph(c) && !num(c)) { return false} }
return true
}




------------------
PS Недочитал тему до конца...
Ratings: 0 negative/0 positive
Re: Может кто знает что егто такое
Петров Андрей
Автор

Сообщений: 2506
Откуда: Химки (М.О.)
Дата регистрации: 17.04.2002
FUNCTION checkDigitSum
LPARAMETERS s
&& replace each letter by numerical equivalent to create new string newS
PRIVATE n,news,i,a,n,newm,r
m.newS = ""
FOR i = 1 TO LEN(s)
m.a = ASC(SUBSTR(m.s,m.i,1))
IF (a>=65) AND (a<=90)
m.n = m.a - 55
ELSE
m.n = VAL(SUBSTR(m.s,m.i,1))
ENDIF
m.newS = m.newS + ALLTRIM(STR(m.n))
ENDFOR
&& check digit sum by long division, starting with first two digits
m.newM=VAL(SUBSTR(m.newS,1,2))
m.r=MOD(m.newM,97)
FOR m.i = 3 TO LEN(m.news)
m.newM = 10*m.r + VAL(SUBSTR(m.newS,m.i,1))
m.r=MOD(m.newM,97)
ENDFOR
RETURN m.r=1

А дело оказалось достаточно просто решаемо. И я и Юрий попались на синтаксис SubStr в Java там же не количество вырезаемых символов идет 3 параметром а до какого резать не включая

Всем спасибо...




------------------
PS Недочитал тему до конца...
Ratings: 0 negative/0 positive
Re: Может кто знает что егто такое
JS

Сообщений: 12264
Откуда: Эстония
Дата регистрации: 04.09.2000
И все-таки, что за странный radix - 97?

Петров Андрей
m.r=MOD(m.newM,97)




------------------
Knowledge is better than ignorance!
Website: juri.foxhelp.eu
Ratings: 0 negative/0 positive
Re: Может кто знает что егто такое
JS

Сообщений: 12264
Откуда: Эстония
Дата регистрации: 04.09.2000
Проверил код Андрея на своем IBAN. Говорит, что OK.
Может сразу в решения забросить?




------------------
Knowledge is better than ignorance!
Website: juri.foxhelp.eu
Ratings: 0 negative/0 positive
Re: Может кто знает что егто такое
Петров Андрей
Автор

Сообщений: 2506
Откуда: Химки (М.О.)
Дата регистрации: 17.04.2002
Чего такое Radex я не понял

А 97 - код буквы a (английской)
А что это значит не знаю... Главное заработало...




------------------
PS Недочитал тему до конца...
Ratings: 0 negative/0 positive
Re: Может кто знает что егто такое
JS

Сообщений: 12264
Откуда: Эстония
Дата регистрации: 04.09.2000
Ну да

Петров Андрей
И я и Юрий попались на синтаксис SubStr в Java там же не количество вырезаемых символов идет 3 параметром а до какого резать не включая

"трудности перевода" (С)

Как-то не смотришь на код со стороны другого языка и автоматом переносишь.




------------------
Knowledge is better than ignorance!
Website: juri.foxhelp.eu
Ratings: 0 negative/0 positive
Re: Может кто знает что егто такое
Петров Андрей
Автор

Сообщений: 2506
Откуда: Химки (М.О.)
Дата регистрации: 17.04.2002
Цитата:
Проверил код Андрея на своем IBAN. Говорит, что OK.

Выложу...

Пообещал а на сайте проблемы с загрузкой решений. Пишет НИЗЯ... Выложу попозже.



Отредактировано (18.02.05 15:18)


------------------
PS Недочитал тему до конца...
Ratings: 0 negative/0 positive
Re: Может кто знает что егто такое
JS

Сообщений: 12264
Откуда: Эстония
Дата регистрации: 04.09.2000
Петров Андрей
Чего такое Radex я не понял

В VFP - делитель в функции MOD. в JavaScript - основание для преобразования.




------------------
Knowledge is better than ignorance!
Website: juri.foxhelp.eu
Ratings: 0 negative/0 positive
Re: Может кто знает что егто такое
Петров Андрей
Автор

Сообщений: 2506
Откуда: Химки (М.О.)
Дата регистрации: 17.04.2002
Если интересно - прогнал тест проверки на ~ 1000 IBAN-ах. Вроде бы работает...




------------------
PS Недочитал тему до конца...
Ratings: 0 negative/0 positive


Извините, но у вас нет прав для того, чтобы оставлять сообщения в этом форуме.

On-line: 4 (Гостей: 4)

© 2000-2024 Fox Club 
Яндекс.Метрика