How to convert a CString
object to integer in MFC.
If you are using TCHAR.H
routine (implicitly, or explicitly), be sure you use _ttoi()
function, so that it compiles for both Unicode and ANSI compilations.
More details: https://msdn.microsoft.com/en-us/library/yd5xkb5c.aspx
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
}
CString s;
int i;
i = _wtoi(s); // if you use wide charater formats
i = _atoi(s); // otherwise
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 can also use good old sscanf.
CString s;
int i;
int j = _stscanf(s, _T("%d"), &i);
if (j != 1)
{
// tranfer didn't work
}
CString s="143";
int x=atoi(s);
or
CString s=_T("143");
int x=_toti(s);
atoi
will work, if you want to convert CString
to int
.
The problem with the accepted answer is that it cannot signal failure. There's strtol
(STRing TO Long) which can. It's part of a larger family: wcstol
(Wide Character String TO Long, e.g. Unicode), strtoull
(TO Unsigned Long Long, 64bits+), wcstoull
, strtof
(TO Float) and wcstof
.
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.
Define in msdn: https://msdn.microsoft.com/en-us/library/yd5xkb5c.aspx
int atoi(
const char *str
);
int _wtoi(
const wchar_t *str
);
int _atoi_l(
const char *str,
_locale_t locale
);
int _wtoi_l(
const wchar_t *str,
_locale_t locale
);
CString is wchar_t string. So, if you want convert Cstring to int, you can use:
CString s;
int test = _wtoi(s)
CString
depends on the _UNICODE
and _MBCS
preprocessor symbols. It might store a UTF-16 encoded Unicode string, a DBCS characters string or an ASCII string. Suggesting that it would always be a Unicode string is just wrong, sorry. –
Carhart i've written a function that extract numbers from string:
int SnirElgabsi::GetNumberFromCString(CString src, CString str, int length) {
// get startIndex
int startIndex = src.Find(str) + CString(str).GetLength();
// cut the string
CString toreturn = src.Mid(startIndex, length);
// convert to number
return _wtoi(toreturn); // atoi(toreturn)
}
Usage:
CString str = _T("digit:1, number:102");
int digit = GetNumberFromCString(str, _T("digit:"), 1);
int number = GetNumberFromCString(str, _T("number:"), 3);
Q: How to convert a CString object to integer in MFC?
A: The first requirement for the CString object is that it must contain only numbers. A string can contain a lot of digits, maybe more than an integer can handle. To be able to convert it to an integer, you also need to know how many digits fit in an integer in C++. This can vary per platform.
constexpr int maxdigits = std::numeric_limits<int>::digits10;
So you first have to cut string to size before you release a convert function on the CString object. A CString handles in UNICODE mode wchar_t characters, so you need something like _wtoi() to do the conversion.
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.
© 2022 - 2024 — McMap. All rights reserved.