Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Ayuda con cadenas

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Ayuda con cadenas Responder citando

Como hago para saber si en contenido de un AnsiString es numerico o texto?
gracias
Volver arriba
Mensaje    Asunto: Responder citando

Hola, angela. Todo depende de lo que entiendas por número. Si se trata simplemente de números escritos de la forma habitual (sin exponentes, quiero decir) puedes verificar que sus elementos coincidan con la estructura que ha de tener uno de ellos: #####.0000, por ejemplo, donde # representa un dígito o nada (siempre que haya parte decimal, es decir, el número 0.7 a menudo se representa sólo por .7) y los 0 representan dígitos. Si el AnsiString contiene más de un punto decimal ya no es un número. Entonces te bastaría con comprobar uno a uno los caracteres que componen el AnsiString y si son todos dígitos a excepción de un posible punto decimal se trata de un número, en cualquier otro caso no será un número. Una solución sería:
Código:
AnsiString texto;
//... código en el que puede ser modificado el AnsiString;
char *t;      /*Declaramos un puntero a char, más rápido de evaluar que un AnsiString*/
strcpy(t, texto.c_str());     /*Copiamos en el puntero el contenido del AnsiString*/
bool puntoDecimal = false;
if (*t == '-')
   t++;    /*Si es negativo su primer caracter será el menos, ya lo hemos leído*/
for (; t != '\0'; t++) {
   if (!puntoDecimal && *t == '.') {
      puntoDecimal = true;
      continue;
   }        /*Con esto nos quedamos con el primer punto decimal*/
   if ((*t < '0' || *t > '9') && *t != '.')     /*Si hubiera un segundo punto decimal o cualquier caracter que no fuera un dígito se saldría del bucle sin finalizarlo*/
      break;
}
/*Ahora ya sabemos si se trata de un número*/
if *t == '\0'
   //... se trata de un número
else
   //... no es un número tradicional
Debería funcionar, aunque no lo he probado.

Evidentemente si tu número puede estar en su expresión científica o usar separadores de miles deberías tratarlo algo más delicadamente.

Podrías también trabajar con excepciones, intentado convertir el AnsiString a float o lo que te interese y si no es posible ya sabes que no es un número.

Creo que existe una función llamada isNAN (o algo similar, quiere decir isNotANumber) pero no puedo mirar ahora si opera con AnsiString, busca algo similar en la ayuda.

Suerte.
_________________
Ojos ... no son ojos porque los ves, son ojos porque te miran
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Código:

bool EsNumero(AnsiString sCadena)
{
bool ret=true; // por defaul si es numero
try {
    StrToFloat(sCadena);
     }
    catch(...)
    {
    ret=false; // No es numero
    }
return ret;
}


Posiblemente algunos puristas de C++ indicara que hago mal uso de una excepciones y sobre todo de un catch (...), pero pienso

Si siempre nos cuidamos de ellas,por que no sacarles provecho.. en otras palabras

Cita:

Siempre matan al toro, y el toro cuando mata?


Saludos desde el caribe mexicano
_________________
Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc

http://www.touchsoftwares.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Muchas Gracias
me sirvio de mucho
Volver arriba
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.