Skip to content
TFE Times

TFE Times

Business, Technology, and Culture

Brandeis University Master of Finance Leaderboard 728x90
University of California Irvine Leaderboard
Click here
Click here
MAFI_728x90
NYU Tandon School of Engineering Leaderboard
University of California Irvine Leaderboard
MAFI_728x90
RPI Leaderboard
Click here
  • Business
  • Culture
  • Technology
  • International Rankings
    • Bangladesh
    • Canada
    • Egypt
    • India
    • Nigeria
    • Pakistan
    • Philippines
    • United Kingdom
    • United States of America
  • Masters Rankings
    • Accounting
    • Business Analytics
    • Chiropractic
    • Computer Engineering
    • Computer Science
    • Economics
    • Education
    • Finance
    • Financial Economics
    • Financial Engineering
    • Law
    • Management
    • Marketing
    • MBA
    • Nursing
    • Social Work
  • Resources
    • C++
      • Beginner’s Guide to C++
      • An Introduction to the Imperative Part of C++
      • C++ Code
        • Sorts
        • Binary Search Trees
        • Strings
        • Binary Search
        • Math
        • Quant
        • Puzzles/Games
        • Language Concepts
        • Graphics
        • OS Operations
        • Graphs
      • C++ Full Course
      • C++ Crash Course
      • C++ Interview Questions
      • C++ Q/A
      • C++ Books
      • C++ Free Books
      • C++ Videos
    • C Questions
    • C Programming Tips
    • Java Questions
    • Quant Data Sources
    • Quant Questions

C++: IBAN

Posted on September 1, 2017October 10, 2017 by TFE Times
Posted in C++ PuzzlesTagged bban, characters, code, iban, International Bank Account Number
Bjarne-stroustrup
 

The International Bank Account Number (IBAN) is an internationally agreed means of identifying bank accounts across national borders with a reduced risk of propagating transcription errors.
The IBAN consists of up to 34 alphanumeric characters: first the two-letter ISO 3166-1 alpha-2 country code, then two check digits, and finally a country-specific Basic Bank Account Number (BBAN).
The check digits enable a sanity check of the bank account number to confirm its integrity even before submitting a transaction.

The task here is to validate the following fictitious IBAN: GB82 WEST 1234 5698 7654 32.

Details of the algorithm can be found on the Wikipedia page.

#include <string>
#include <iostream>
#include <boost/algorithm/string.hpp>
#include <map>
#include <algorithm>
#include <cctype>
using namespace boost::algorithm ;

bool isValid ( const std::string &ibanstring ) {

	static std::map<std::string, int> countrycodes 
	{ {"AL" , 28} , {"AD" , 24} , {"AT" , 20} , {"AZ" , 28 } ,
		{"BE" , 16} , {"BH" , 22} , {"BA" , 20} , {"BR" , 29 } ,
		{"BG" , 22} , {"CR" , 21} , {"HR" , 21} , {"CY" , 28 } ,
		{"CZ" , 24} , {"DK" , 18} , {"DO" , 28} , {"EE" , 20 } ,
		{"FO" , 18} , {"FI" , 18} , {"FR" , 27} , {"GE" , 22 } ,
		{"DE" , 22} , {"GI" , 23} , {"GR" , 27} , {"GL" , 18 } ,
		{"GT" , 28} , {"HU" , 28} , {"IS" , 26} , {"IE" , 22 } , 
		{"IL" , 23} , {"IT" , 27} , {"KZ" , 20} , {"KW" , 30 } ,
		{"LV" , 21} , {"LB" , 28} , {"LI" , 21} , {"LT" , 20 } , 
		{"LU" , 20} , {"MK" , 19} , {"MT" , 31} , {"MR" , 27 } , 
		{"MU" , 30} , {"MC" , 27} , {"MD" , 24} , {"ME" , 22 } , 
		{"NL" , 18} , {"NO" , 15} , {"PK" , 24} , {"PS" , 29 } , 
		{"PL" , 28} , {"PT" , 25} , {"RO" , 24} , {"SM" , 27 } , 
		{"SA" , 24} , {"RS" , 22} , {"SK" , 24} , {"SI" , 19 } , 
		{"ES" , 24} , {"SE" , 24} , {"CH" , 21} , {"TN" , 24 } ,
		{"TR" , 26} , {"AE" , 23} , {"GB" , 22} , {"VG" , 24 } } ;
	std::string teststring( ibanstring ) ;
	erase_all( teststring , " " ) ; //defined in boost/algorithm/string.hpp
	if ( countrycodes.find( teststring.substr(0 , 2 )) == countrycodes.end( ) ) 
	return false ;
	if ( teststring.length( ) != countrycodes[ teststring.substr( 0 , 2 ) ] ) 
	return false ;
	if ( ! ( all ( teststring , is_alnum( ) ) ) ) 
	return false ;
	to_upper( teststring ) ;
	teststring = teststring.append( teststring.substr( 0 , 4 ) ) ;
	teststring.assign( teststring.substr( 4 ) ) ;
	std::string numberstring ;//will contain the letter substitutions
	for ( int i = 0 ; i < teststring.length( ) ; i++ ) {
		if ( std::isdigit( teststring[ i ] ) ) 
		numberstring = numberstring +  teststring[ i ]  ;
		if ( std::isupper( teststring[ i ] ) ) 
		numberstring = numberstring +  std::to_string( static_cast<int>( teststring[ i ] ) - 55 ) ;
	}
	//implements a stepwise check for mod 97 in chunks of 9 at the first time
	// , then in chunks of seven prepended by the last mod 97 operation converted
	//to a string
	int segstart = 0 ;
	int step = 9 ;
	std::string prepended ;
	long number = 0 ;
	while ( segstart  < numberstring.length( ) - step ) {
		number = std::stol( prepended + numberstring.substr( segstart , step ) ) ;
		int remainder = number % 97 ;
		prepended =  std::to_string( remainder ) ;
		if ( remainder < 10 ) 
		prepended = "0" + prepended ;
		segstart = segstart + step ;
		step = 7 ;
	}
	number = std::stol( prepended + numberstring.substr( segstart )) ;
	return ( number % 97 == 1 ) ;
}

int main( ) {
	std::cout << "GB82 WEST 1234 5698 7654 32 is " << ( isValid( "GB82 WEST 1234 5698 7654 32" ) ? "" : "not " ) 
	<< "valid!" << std::endl ;
	std::cout << "GB82TEST12345698765432 is " << ( isValid( "GB82TEST12345698765432" ) ? "" : "not " ) 
	<< "valid!" << std::endl ;
	return 0 ;
}
Output:
GB82 WEST 1234 5698 7654 32 is valid!
GB82TEST12345698765432 is not valid!

SOURCE

Content is available under GNU Free Documentation License 1.2.

Related

Post navigation

Bjarne-stroustrup
← Previous

C++: Mutual Recursion

September 1, 2017
Next →

Why is processing a sorted array faster than an unsorted array?

September 1, 2017

Related Posts

Bjarne-stroustrup

C++: Fibonacci Word Fractals

Posted on September 1, 2017October 10, 2017
Bjarne-stroustrup

C++: I Before E Except After C

Posted on September 1, 2017October 10, 2017
Bjarne-stroustrup

C++: Flatten a List

Posted on September 1, 2017October 10, 2017
Click here
NYU Tandon School of Engineering Sideboard
University of California Irvine Leaderboard
output_8BgzjE
University of California Berkeley Master of Financial Engineering MFE Sideboard
Brandeis Business School
  • The All-Time Most Watched Shows On Netflix

    September 20, 2025May 25, 2025 by TFE Times
  • What The World’s Paying For Eggs

    September 19, 2025May 25, 2025 by TFE Times
  • How Do Car Accident Laws Work in Queens Under New York’s No-Fault System?

    September 17, 2025 by TFE Times
  • All About Playing at Golden Crown Casino: A Guide for Australian Players

    September 17, 2025 by TFE Times
  • Table Games at Legiano Casino: Roulette, Poker and Blackjack

    September 17, 2025 by TFE Times
  • Supporting Curiosity and Critical Thinking in Young Learners

    September 17, 2025 by TFE Times
  • Post-Pandemic GDP Recovery

    September 17, 2025May 25, 2025 by TFE Times
  • Imports’ Share Of Economies

    September 16, 2025May 25, 2025 by TFE Times
  • Why Millennials and Gen Z Are Choosing Slots Over Traditional Table Games

    September 15, 2025 by TFE Times
  • How to Open a Checking Account and Start Building Financial Independence

    September 15, 2025 by TFE Times

Copyright © TFE Times, LLC. All Rights Reserved.

Terms of Service | Privacy Policy | Disclaimer

WordPress Theme : Eight Paper by 8Degree Themes