>? CheckIBAN("BG94EASYPAY19999999998") && .t. >? CheckIBAN("BG94EASYPAY19999999997") && .f. > >FUNCTION CheckIBAN(lcIBAN, lbNotToAsk, lbOtherFonts) >LOCAL lcString, lnFor, lcOneSymb, lcOstatak, lnMod97 >LOCAL lbReturnValue >m.lcIBAN = ALLTRIM(m.lcIBAN) && Remove all intervals >IF VARTYPE(m.lcIBAN) == [C] AND BETWEEN(LEN(m.lcIBAN), 15, 31) && all IBANs should be 15->31 chars length > m.lcIBAN = SUBSTR(m.lcIBAN,5)+LEFT(m.lcIBAN,4) && Move first 4 chars at the end > m.lcString = [] > > FOR m.lnFor = 1 TO LEN(m.lcIBAN) && All letters to numbers [ A - 10, B-11 ... Z-35] > m.lcOneSymb = SUBSTR(m.lcIBAN,m.lnFor,1) > IF ISDIGIT(m.lcOneSymb) > m.lcString = m.lcString + m.lcOneSymb > ELSE > m.lcString = m.lcString + TRANSFORM((ASC(m.lcOneSymb)-55)) > ENDIF > NEXT > m.lcOstatak = [] > DO WHILE NOT EMPTY(m.lcString) > m.lcOneSymb = VAL(m.lcOstatak + LEFT(m.lcString,1)) > m.lnFor = INT(m.lcOneSymb/97) > m.lcOstatak = TRANSFORM(INT(m.lcOneSymb - m.lnFor*97)) > m.lcString = SUBSTR(m.lcString,2) > ENDDO > m.lnMod97 = VAL(m.lcOstatak) > m.lbReturnValue = (m.lnMod97 == 1) && Everything is OK if the remainder is 1 >ENDIF > >RETURN m.lbReturnValue >