? 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