Skip to content
TFE Times

TFE Times

Business, Technology, and Culture

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

Posted on September 1, 2017June 2, 2022
Bjarne-stroustrup

C++: Long Multiplication

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

C++: Fibonacci Word Fractals

Posted on September 1, 2017October 10, 2017
University of California Berkeley Master of Financial Engineering MFE Sideboard
University of California Irvine Leaderboard
output_8BgzjE
Brandeis Business School
University of Maryland Masters of Economics Sideboard
NYU Tandon School of Engineering Sideboard
Click here
University of Maryland Masters of Economics Sideboard
  • Illustrated dining collage for Best Restaurants in Ames: 15 Standout Places to Eat

    Best Restaurants in Ames: 15 Standout Places to Eat

    October 10, 2026October 2, 2026 by TFE Times
  • Wide aerial view of a nuclear generating complex beside tidal marshes and a broad river, with a large cooling tower, rounded reactor buildings, an electrical switchyard, and rows of transmission towers.

    History of Public Service Enterprise Group

    October 9, 2026September 19, 2026 by TFE Times
  • Illustrated dining collage for Best Restaurants in Ann Arbor: 15 Standout Places to Eat

    Best Restaurants in Ann Arbor: 15 Standout Places to Eat

    October 9, 2026October 2, 2026 by TFE Times
  • The Most Overlooked Feature of Modern Travel Data Plans

    October 9, 2026 by TFE Times
  • Champions under pressure: how every defending champion looked after five games

    October 9, 2026 by TFE Times
  • The History of the Putter: How Golf’s Simplest Club Became Its Most Personal

    October 9, 2026July 13, 2026 by TFE Times
  • 6 Leading GEO Agencies for ChatGPT, Gemini, and AI Search Visibility

    October 8, 2026 by TFE Times
  • A central pharmacy conveyor with blank cartons, a prescription container, and skincare bottles runs between two dark wooden counters, one displaying herbs, apothecary drawers, a brass balance, and a mortar, and the other displaying amber bottles, glass vessels, a scale, and a soda-fountain glass.

    History of Walgreens Boots Alliance

    October 8, 2026September 19, 2026 by TFE Times
  • Illustrative cover for Best Restaurants in Antwerp: 15 Standout Places to Eat

    Best Restaurants in Antwerp: 15 Standout Places to Eat

    October 8, 2026October 2, 2026 by TFE Times
  • How Champagne Became the Drink of Celebration

    October 8, 2026July 13, 2026 by TFE Times

Copyright © TFE Times, LLC. All Rights Reserved.

Terms of Service | Privacy Policy | Disclaimer

WordPress Theme : Eight Paper by 8Degree Themes