bool isNumeric(string s){
if ( !s.empty() && s[0] != '-' )
s = "0" + s; //prepend 0
string garbage;
stringstream ss(s);
ss >> *(auto_ptr<double>(new double)) >> garbage;
/*
//the line above extracts the number into an anonymous variable. it could also be done like this:
double x;
ss >> x >> garbage;
*/
//if there is no garbage return true or else return false
return garbage.empty();
}
comment cela fonctionne:
la surcharge de stringstream >> peut convertir des chaînes en différents types arithmétiques, elle le fait en lisant les caractères séquentiellement à partir du stringstream (ss dans ce cas) jusqu'à ce qu'il manque de caractères OU le caractère suivant ne répond pas aux critères à stocker dans le type de variable de destination.
Exemple 1:
stringstream ss("11");
double my_number;
ss >> my_number; //my number = 11
exemple2:
stringstream ss("011");
double my_number;
ss >> my_number; //my number = 11
exemple3:
stringstream ss("11ABCD");
double my_number;
ss >> my_number; //my number = 11 (even though there are letters after the 11)
l'explication de la variable "garbage" ":
pourquoi ne pas simplement vérifier si l'extraction dans mon double a une valeur valide, puis retourner true si c'est le cas?
Remarquez que l'exemple3 ci-dessus lira toujours avec succès le numéro 11 dans la variable my_number même si la chaîne d'entrée est "11ABCD" (qui n'est pas un nombre).
pour gérer ce cas, nous pouvons faire une autre extraction dans une variable de chaîne (que j'ai nommée garbage) qui peut lire tout ce qui peut avoir été laissé dans le tampon de chaîne après l'extraction initiale dans la variable de type double. S'il reste quelque chose, il sera lu dans "garbage", ce qui signifie que la chaîne complète passée n'est pas un nombre (elle commence juste par un). dans ce cas, nous voudrions retourner false;
l'explication "0" préfixée:
tenter d'extraire un seul caractère dans un double échouera (renvoyer 0 dans notre double) mais déplacera toujours la position du tampon de chaîne après le caractère. Dans ce cas, notre lecture garbage sera vide, ce qui entraînerait le retour incorrect de la fonction true. pour contourner cela, j'ai ajouté un 0 à la chaîne de sorte que si, par exemple, la chaîne passée était "a", elle soit changée en "0a" afin que le 0 soit extrait dans le double et "a" soit extrait dans les ordures.
l'ajout d'un 0 n'affectera pas la valeur du nombre, donc le nombre sera toujours correctement extrait dans notre variable double.
if (expr) return true; return false;
! Écrivez justereturn expr;
.