>>? 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 >>>
>? CheckIBAN("BG94EASYPAY19999999999") && .t. >>