Skip to content
TFE Times

TFE Times

Business, Technology, and Culture

Brandeis University Master of Finance Leaderboard 728x90
Click here
University of California Irvine Leaderboard
NYU Tandon School of Engineering Leaderboard
University of Maryland Masters of Economics  Leaderboard
University of Maryland Masters of Economics Leaderboard
Click here
Click here
MAFI_728x90
RPI Leaderboard
University of California Irvine Leaderboard
MAFI_728x90
  • 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++: Hailstone Sequence

September 1, 2017
Next →

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

September 1, 2017

Related Posts

Bjarne-stroustrup

C++: Generator

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

C++: Josephus Problem

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

C++: N-Queens Problem

Posted on September 1, 2017October 9, 2017
University of California Irvine Leaderboard
output_8BgzjE
University of Maryland Masters of Economics Sideboard
Click here
Brandeis Business School
University of Maryland Masters of Economics Sideboard
University of California Berkeley Master of Financial Engineering MFE Sideboard
NYU Tandon School of Engineering Sideboard
  • OpenAI Stock Price Outlook and What Investors Should Know in 2026

    May 1, 2026 by TFE Times
  • America’s Wealth: U.S. Millionaires And Billionaires Vs. The Next Top 9 Countries

    May 1, 2026October 29, 2025 by TFE Times
  • U.S. Population Change Forecast 2025 To 2050

    April 30, 2026October 29, 2025 by TFE Times
  • Mercury In Fish

    April 29, 2026October 29, 2025 by TFE Times
  • Europe vs South America: who will win the 2026 World Cup?

    April 28, 2026 by TFE Times
  • How Tire Financing Options Make Replacements More Budget-Friendly

    April 28, 2026 by TFE Times
  • Optimizing Last-Mile Delivery With Smart Technology

    April 28, 2026April 28, 2026 by TFE Times
  • Crypto Careers featured

    The Future of Cryptocurrency in Bangladesh: Trends, Risks, and Possibilities

    April 28, 2026 by TFE Times
  • Annuity vs. lump sum: understanding lottery payout options

    April 28, 2026April 28, 2026 by TFE Times
  • Countries With The Most Years Lived In Poor Health

    April 28, 2026October 29, 2025 by TFE Times

Copyright © TFE Times, LLC. All Rights Reserved.

Terms of Service | Privacy Policy | Disclaimer

WordPress Theme : Eight Paper by 8Degree Themes