 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
angela Invitado
|
Publicado: Mar 08 Feb, 2005 4:34 pm Asunto: Ayuda con cadenas |
|
|
Como hago para saber si en contenido de un AnsiString es numerico o texto?
gracias |
|
| Volver arriba |
|
 |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Mie 09 Feb, 2005 2:13 am Asunto: |
|
|
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 |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Mie 09 Feb, 2005 2:26 am Asunto: |
|
|
| 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 |
|
 |
angela Invitado
|
Publicado: Vie 11 Feb, 2005 4:14 pm Asunto: |
|
|
Muchas Gracias
me sirvio de mucho |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|