web-dev-qa-db-fra.com

Convertir MFC CString en entier

Comment convertir un objet CString en entier dans MFC.

40
rahul

Si vous utilisez la routine TCHAR.H (Implicitement ou explicitement), assurez-vous que vous utilisez la fonction _ttoi(), afin qu'elle compile pour les compilations Unicode et ANSI.

Plus de détails: https://msdn.Microsoft.com/en-us/library/yd5xkb5c.aspx

39
Vladimir Kocjancic

L'approche la plus simple consiste à utiliser la fonction atoi() trouvée dans stdlib.h:

CString s = "123";
int x = atoi( s );

Cependant, cela ne fonctionne pas bien avec le cas où la chaîne ne contient pas un entier valide, auquel cas vous devez rechercher la fonction strtol() :

CString s = "12zzz";    // bad integer
char * p;
int x = strtol ( s, & p, 10 );
if ( * p != 0 ) {
   // s does not contain an integer
}
35
anon
CString s;
int i;
i = _wtoi(s); // if you use wide charater formats
i = _atoi(s); // otherwise
16
PaV

UNE _ttoi la fonction peut convertir CString en entier, les caractères large et ansi peuvent fonctionner. Voici les détails:

CString str = _T("123");
int i = _ttoi(str);
9
Jerry Young

vous pouvez également utiliser un bon vieux sscanf.

CString s;
int i;
int j = _stscanf(s, _T("%d"), &i);
if (j != 1)
{
   // tranfer didn't work
}
8
BrianK
CString s="143";
int x=atoi(s);

ou

CString s=_T("143");
int x=_toti(s);

atoi fonctionnera, si vous voulez convertir CString en int.

3
sankar

Le problème avec la réponse acceptée est qu'elle ne peut pas signaler d'échec. Il y a strtol (STRing TO Long) qui le peut. Il fait partie d'une famille plus large: wcstol (chaîne de caractères larges TO Long, par exemple Unicode), strtoull (TO Unsigned Long Long, 64bits +), wcstoull, strtof (TO Float) et wcstof.

3
MSalters

La solution canonique consiste à utiliser la bibliothèque standard C++ pour la conversion. Selon le type de retour souhaité, les fonctions de conversion suivantes sont disponibles: std :: stoi, std :: stol ou std :: stoll (ou leurs homologues non signés std :: stoul, std :: stoull ).

L'implémentation est assez simple:

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() ) } );
}

Toutes ces implémentations signalent des erreurs par le biais d'exceptions ( std :: invalid_argument si aucune conversion n'a pu être effectuée, std :: out_of_range si la valeur convertie tombe hors de la plage de la type de résultat). Construire le temporaire std::[w]string Peut aussi lancer.

Les implémentations peuvent être utilisées à la fois pour les projets Unicode et MBCS.

2
IInspectable

Définissez dans 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 est une chaîne wchar_t. Donc, si vous voulez convertir Cstring en int, vous pouvez utiliser:

 CString s;  
int test = _wtoi(s)
1
HungVu