Back to Richel Bilderbeek's homepage.

Back to Richel Bilderbeek's Code Snippets.

 

 

 

HexStrIsInt

 

Check if a hexadecimal std::string can be converted to an integer.

 

There are two options:

* Option #1 accepts a shorter range, but can also accept negatives

* Option #2 accepts a much larger range, but cannot accept negatives

 

Code in plain text can be found here (#1) and here (#2).

 

Option #1

 

#include <sstream>

#include <cassert>

 

//From http://www.richelbilderbeek.nl/CppHexStrIsInt.htm

//Checks whether a std::string containg hexadecimal

//can be converted to an int.

//Returns true if possible, also returning this integer by referencing.

//Returns false otherwise, setting the referenced int to zero.

bool IsHexInt(const std::string& s, int& rInt)

{

std::istringstream i(s);

i >> std::hex;

if (!(i >> rInt))

{

rInt = 0; return false;

}

return true;

}

 

int main()

{

int temp = -1;

assert(IsHexInt("0",temp) == true);

assert(IsHexInt("9",temp) == true);

assert(IsHexInt("A",temp) == true);

assert(IsHexInt("F",temp) == true);

assert(IsHexInt("-F",temp) == true);

assert(IsHexInt("-F85AE",temp) == true);

assert(IsHexInt("80000000",temp) == true); //Maximal value

assert(IsHexInt("80000001",temp) == false); //Out of range

assert(IsHexInt("G",temp) == false);

 

assert(IsHexInt("--80000000",temp) == false);

assert(IsHexInt("-800-00000",temp) == true); //Does not detect ill-formed numbers

assert(IsHexInt("80000-000",temp) == true); //Does not detect ill-formed numbers

}

 

Note that the std::string cannot have a value higher then 80000000.

 

Option #2

 

Suggested by AsmGuru62:

 

#include <cstring>

#include <cassert>

 

//From http://www.richelbilderbeek.nl/CppHexStrIsInt.htm

//This solution was inspired by AsmGuru62

//http://www.programmersheaven.com/c/authorpage.asp?AuthorID=12069

//Checks if a C-style string only contains hexadecimal characters

bool IsAllHex (const char* const must_be_hex)

{

char copy_of_param[64];

 

return(

std::strtok (

std::strcpy(copy_of_param, must_be_hex),

"0123456789ABCDEFabcdef") == 0);

}

 

int main()

{

assert(IsAllHex("0")==true);

assert(IsAllHex("9")==true);

assert(IsAllHex("A")==true);

assert(IsAllHex("F")==true);

assert(IsAllHex("-F")==false); //Does not accept negatives

assert(IsAllHex("-F85AE")==false); //Does not accept negatives

assert(IsAllHex("FFFFFFFFFFFFFFFFFFFFFFFFFFF")==true);

assert(IsAllHex("G")==false);

}

 

 

As option #1 also has defects in detecting negatives, you might want to change the IsAllHex to the one below:

 

 

//From http://www.richelbilderbeek.nl/CppHexStrIsInt.htm

//This solution was inspired by AsmGuru62

//http://www.programmersheaven.com/c/authorpage.asp?AuthorID=12069

//Checks if a C-style string only contains hexadecimal characters

//and minuses

bool IsAllHex (const char* const must_be_hex)

{

char copy_of_param[64];

 

return(

std::strtok (

std::strcpy(copy_of_param, must_be_hex),

"0123456789ABCDEFabcdef-") == 0);

}

 

 

 

Back to Richel Bilderbeek's Code Snippets.

Back to Richel Bilderbeek's homepage.