How to convert a CString
object to integer in MFC.
The simplest approach is to use the atoi()
function found in stdlib.h
:
CString s = "123";
int x = atoi( s );
However, this does not deal well with the case where the string does not contain a valid integer, in which case you should investigate the strtol() function:
CString s = "12zzz"; // bad integer
char * p;
int x = strtol ( s, & p, 10 );
if ( * p != 0 ) {
// s does not contain an integer
}
A _ttoi
function can convert CString
to integer, both wide char and ansi char can work. Below is the details:
CString str = _T("123");
int i = _ttoi(str);
You may use the C atoi function ( in a try / catch clause because the conversion isn't always possible) But there's nothing in the MFC classes to do it better.
you can also use good old sscanf.
CString s;
int i;
int j = _stscanf(s, _T("%d"), &i);
if (j != 1)
{
// tranfer didn't work
}
The canonical solution is to use the C++ Standard Library for the conversion. Depending on the desired return type, the following conversion functions are available: std::stoi, std::stol, or std::stoll (or their unsigned counterparts std::stoul, std::stoull).
The implementation is fairly straight forward:
int ToInt( const CString& str ) {
return std::stoi( { str.GetString(), static_cast<size_t>( str.GetLength() ) } );
}
long ToLong( const CString& str ) {
return std::stol( { str.GetString(), static_cast<size_t>( str.GetLength() ) } );
}
long long ToLongLong( const CString& str ) {
return std::stoll( { str.GetString(), static_cast<size_t>( str.GetLength() ) } );
}
unsigned long ToULong( const CString& str ) {
return std::stoul( { str.GetString(), static_cast<size_t>( str.GetLength() ) } );
}
unsigned long long ToULongLong( const CString& str ) {
return std::stoull( { str.GetString(), static_cast<size_t>( str.GetLength() ) } );
}
All of these implementations report errors through exceptions (std::invalid_argument if no conversion could be performed, std::out_of_range if the converted value would fall out of the range of the result type). Constructing the temporary std::[w]string
can also throw.
The implementations can be used for both Unicode as well as MBCS projects.