validateIBAN(IBANnr)
Last updated January 07, 2015
Version: 1 | Requires: CF10 | Library: FinancialLib
	Description: 
	Validates an IBAN number.
	Return Values: 
	Returns a boolean.
Example:
<cfoutput>#validateIBAN("NL60INGB0006155045")#</cfoutput><!--- this is a valid IBAN --->
<br />
<cfoutput>#validateIBAN("NL58INGA0006155031")#</cfoutput><!--- an invalid IBAN --->
Parameters:
| Name | Description | Required | 
|---|---|---|
| IBANnr | IBAN input. | Yes | 
Full UDF Source:
<!---
Validates an IBAN number.
@param IBANnr IBAN input (Required)
@author Hank van Empel (h.vanempel@s-hertogenbosch.nl)
@version 1.0, January 7, 2015
--->
<cffunction name="validateIBAN" returntype="boolean" output="no">
    <cfargument name="IBANnr" required="Yes" type="string" /> <!--- input IBAN --->
    <cfset var ci = structNew() />
    <!--- remove spaces first from input-IBAN --->
    <cfset arguments.IBANnr = replaceNoCase(arguments.IBANnr," ","","ALL") />
    <!--- after spaces are removed, we can do a syntaxcheck, IE. "NL60INGB0001234567" --->
    <cfset ci.syntaxCheck = REFind("[A-Z]{2}[0-9]{2}[A-Z]{4}[0-9]{4}[0-9]{4}[0-9]{2}", arguments.IBANnr) />
    <cfif ci.syntaxCheck>
        <cfset ci.IBANnr = arguments.IBANnr />    
        <cfset ci.Result = ci.IBANnr />
    <cfelse> <!--- IBAN failed the syntax-check, so return False --->
        <cfreturn false />
    </cfif>
    <!--- our example is "NL60INGB0001234567" --->
    <!--- where "NL" is the country-code
                                       "60" is our control-number
                                       "INGB" is our bank-code
                                       "0001234567" is our accountnumber --->
    <!--- !!! our example is NOT a valid IBAN by the way --->                                  
    
    <!--- determine controlnumber; we will use this later on (in our example: "60")--->        
    <cfset ci.submittdeControlNumber = mid(ci.IBANnr, 3, 2) />
    <!--- get first 2 characters, they represent the country-code (in our example: "NL") --->
    <cfset ci.Landcode = left(ci.IBANnr, 2) />
    <!--- turn these characters ("NL" in our example) into digits where A=10, B=11 etc. --->
    <!--- to do so we subtract 55 from the character's ASCII-value --->
    <!--- remember, these have to be uppercase --->
    <!--- Example: "AB" becomes 1011, "NL" becomes 2321 --->
    <cfset ci.countryDigits = ((asc(left(ci.Landcode,1))-55)*100) + (asc(right(ci.Landcode,1))-55) /> 
    <!--- add 2 zeroes and convert to numeric at the same time by multiplying it with 100--->
    <cfset ci.countryDigits = ci.countryDigits * 100 />
    <!--- get the bankcode, in this example "INGB"  (A=10, B=11 etc.) --->
    <cfset ci.Bankcode = Mid(ci.IBANnr, 5, 4 ) />
    <!--- convert to digits, where (A=10, B=11 etc.) --->
    <!--- IE. "INGB" becomes 18231611 --->
    <cfset ci.bankDigits = (asc(left(ci.Bankcode, 1)) - 55) & (asc(Mid(ci.Bankcode, 2, 1)) - 55) & (asc(Mid(ci.Bankcode, 3, 1)) - 55) & (asc(Mid(ci.Bankcode, 4, 1)) - 55) />
    <!--- replace the bankcode by it's numeric value (ASCII-value minus 55, for each character)
    IE. "INGB" will become "18231611" --->
   <cfset ci.IBANnr = replace(ci.IBANnr, ci.bankcode, ci.bankDigits, "ONE") />
    <!--- remove the bankcode and the controlnumber, in our case "NL60" --->
    <cfset ci.IBANnr = Right(ci.IBANnr, Len(ci.IBANnr) -4) />
     <!--- concatenate the numbervalue that represents the
    bankname (in this example "INGB") to the accountnumber --->
    <cfset ci.IBANString = ci.IBANnr & ci.countryDigits />
    <!--- create a Java.BigDecimal because CF cannot handle such a big number
               in our example that would be 182316110003770857232100 --->
    <cfset ci.bigInt = createObject("java", "java.math.BigDecimal").init(javaCast("string", ci.IBANnr&ci.countryDigits)) />
    <!--- all other component have to have the same cast: bigdecimal --->
    <cfset ci.baseNumber = createObject("java", "java.math.BigDecimal").init(javaCast("string", "98" )) />
    <cfset ci.divider = createObject("java", "java.math.BigDecimal").init(javaCast("string", "97" )) />
    <!--- take the baseNumber and subtract the remainder after divide by 97--->
    <cfset ci.remainder = ci.baseNumber - ci.bigInt.remainder(ci.divider) />
    <!--- return True if the remainder matches the controlNumber (56 in this example) --->
    <cfif ci.submittdeControlNumber EQ ci.remainder>
       <cfreturn true />
    <cfelse>
        <cfreturn false />
    </cfif>
</cffunction>
Search CFLib.org
Latest Additions
									
									Raymond Camden added 
									QueryDeleteRows 
									November 04, 2017
								
								
									
									Leigh added 
									nullPad 
									May 11, 2016
								
								
									
									Raymond Camden added 
									stripHTML 
									May 10, 2016
								
								
									
									Kevin Cotton added 
									date2ExcelDate 
									May 05, 2016
								
								
									
									Raymond Camden added 
									CapFirst 
									April 25, 2016