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();
}
cómo funciona:
la sobrecarga de secuencia de cadena >> puede convertir cadenas a varios tipos aritméticos, lo hace leyendo caracteres secuencialmente de la secuencia de secuencia (ss en este caso) hasta que se queda sin caracteres O el siguiente carácter no cumple los criterios para ser almacenado en el tipo de variable de destino.
Ejemplo 1:
stringstream ss("11");
double my_number;
ss >> my_number; //my number = 11
ejemplo2:
stringstream ss("011");
double my_number;
ss >> my_number; //my number = 11
ejemplo3:
stringstream ss("11ABCD");
double my_number;
ss >> my_number; //my number = 11 (even though there are letters after the 11)
la explicación variable "basura":
¿por qué no simplemente verificar si la extracción en mi doble tiene un valor válido y luego devolver verdadero si lo tiene?
observe que el ejemplo 3 anterior aún leerá con éxito el número 11 en la variable my_number incluso si la cadena de entrada es "11ABCD" (que no es un número).
Para manejar este caso, podemos hacer otra extracción en una variable de cadena (que denominé basura) que puede leer cualquier cosa que pueda haber quedado en el búfer de cadena después de la extracción inicial en la variable de tipo double. Si queda algo, se leerá en "basura", lo que significa que la cadena completa que se pasó no era un número (solo comienza con uno). en este caso, nos gustaría devolver falso;
la explicación "0" antepuesta:
intentar extraer un solo carácter en un doble fallará (devolver 0 en nuestro doble) pero aún moverá la posición del búfer de cadena a después del carácter. En este caso, nuestra lectura de basura estará vacía, lo que provocaría que la función devuelva incorrectamente verdadero. para evitar esto, agregué un 0 a la cadena de modo que si, por ejemplo, la cadena que se ingresó fuera "a", se cambia a "0a" para que el 0 se extraiga en el doble y "a" se extraiga en la basura.
anteponer un 0 no afectará el valor del número, por lo que el número aún se extraerá correctamente en nuestra variable doble.
if (expr) return true; return false;
! Solo escribereturn expr;
.