Convert MFC CString to integer
Asked Answered
D

12

53

How to convert a CString object to integer in MFC.

Diarmuid answered 14/6, 2009 at 12:42 Comment(0)
G
44

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

Glucosuria answered 24/6, 2010 at 12:54 Comment(0)
K
42

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
}
Kinkajou answered 14/6, 2009 at 12:49 Comment(3)
stumbled here beacause the compiler says: "atoi: cannot convert CString to const char *"; then I discovered your answer does not work if it is an unicode project, _ttoi is better as pointed out by UnagiStaub
error C2664: 'atoi' : cannot convert parameter 1 from 'CString' to 'const char *'Benempt
Now, MFC CString default use w_char which can not use atoi.Penstemon
R
20
CString s;
int i;
i = _wtoi(s); // if you use wide charater formats
i = _atoi(s); // otherwise
Ruggles answered 14/6, 2009 at 12:51 Comment(1)
You need to do something with the return values of those functions for this code to be useful.Kinkajou
T
16

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);
Timmerman answered 8/6, 2015 at 11:9 Comment(0)
P
9

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
}
Prohibitive answered 17/6, 2009 at 2:22 Comment(0)
E
4
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.

Egest answered 1/9, 2017 at 3:37 Comment(1)
Now, MFC CString default use w_char which can not use atoi.Penstemon
L
3

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.

Landmark answered 1/4, 2015 at 13:39 Comment(0)
C
3

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.

Carhart answered 24/10, 2016 at 21:37 Comment(0)
F
1

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)
Freiman answered 24/6, 2015 at 8:31 Comment(1)
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
B
1

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);
Burp answered 9/12, 2019 at 8:25 Comment(0)
U
0

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.

Unpaid answered 2/2, 2023 at 12:32 Comment(0)
P
-3

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.

Phototelegraph answered 28/12, 2012 at 21:41 Comment(3)
Welcome to stackoverflow. You may be right, but it looks like that was mentioned already back in 2009. (When you have sufficient reputation, you can add comments to existing answers)Fuzzy
atoi doesn't raise exceptionsCrush
C language has no support for exception handling.Theone

© 2022 - 2024 — McMap. All rights reserved.