Skip to content
TFE Times

TFE Times

Business, Technology, and Culture

MAFI_728x90
University of Maryland Masters of Economics  Leaderboard
Click here
Brandeis University Master of Finance Leaderboard 728x90
Click here
University of California Irvine Leaderboard
NYU Tandon School of Engineering Leaderboard
MAFI_728x90
Click here
University of Maryland Masters of Economics Leaderboard
RPI Leaderboard
University of California Irvine Leaderboard
  • Business
  • Culture
    • Beer Guide
    • Cheese Guide
    • Cigar Guide
    • Coffee Guide
    • Wine Guide
  • 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++: MD5

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

C++: Deal Cards for FreeCell

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

C++: Flatten a List

Posted on September 1, 2017October 10, 2017
Brandeis Business School
University of California Irvine Leaderboard
University of Maryland Masters of Economics Sideboard
University of Maryland Masters of Economics Sideboard
NYU Tandon School of Engineering Sideboard
University of California Berkeley Master of Financial Engineering MFE Sideboard
Click here
output_8BgzjE
  • Illustration of grapes, a potato, grain, sugarcane and agave beside a copper still and clear and amber spirit samples.

    What Are Spirits? A Beginner’s Guide

    October 31, 2026October 25, 2026 by TFE Times
  • Best Restaurants in Raleigh: 15 Standout Places to Eat — food and city collage

    Best Restaurants in Raleigh: 15 Standout Places to Eat

    October 30, 2026October 16, 2026 by TFE Times
  • What The Top 1% Pays In Taxes Across The U.S.

    October 30, 2026October 17, 2026 by TFE Times
  • Paired illustrative Arabica and Robusta coffee branches with red cherries, glossy leaves and green coffee seeds.

    Arabica vs. Robusta: What’s the Difference?

    October 30, 2026October 24, 2026 by TFE Times
  • A warm, dim box-office counter with a mechanical ticket device, paper roll, and road case transitions through venue railings to a cool-lit arena entrance, contactless scanner, crowded concert floor, and illuminated stage.

    History of Live Nation Entertainment

    October 29, 2026September 19, 2026 by TFE Times
  • Best Restaurants in Lubbock: 15 Standout Places to Eat — food and city collage

    Best Restaurants in Lubbock: 15 Standout Places to Eat

    October 29, 2026October 16, 2026 by TFE Times
  • How cloud contact platforms improve client response times

    October 29, 2026 by TFE Times
  • Illustrated history cover for the Washington Commanders

    History of the Washington Commanders: From Boston Beginnings to Washington’s Five Championship Seasons

    October 29, 2026October 17, 2026 by TFE Times
  • An unlit leaf-wrapped cigar and a white-paper filtered cigarette in separate parallel channels on a cool grey specimen bench.

    Cigars vs. Cigarettes: Understanding the Important Differences

    October 29, 2026October 24, 2026 by TFE Times
  • A split-era office scene shows a nineteenth-century agent passing a leather folio to a family across a wooden desk, transitioning into a modern financial consultation with a couple beside large windows overlooking a city skyline.

    History of Securian Financial Group

    October 28, 2026September 19, 2026 by TFE Times

Copyright © TFE Times, LLC. All Rights Reserved.

Terms of Service | Privacy Policy | Disclaimer

WordPress Theme : Eight Paper by 8Degree Themes