Comment convertir un objet CString
en entier dans MFC.
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
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
}
CString s;
int i;
i = _wtoi(s); // if you use wide charater formats
i = _atoi(s); // otherwise
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);
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
}
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
.
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
.
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.
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)