Ir al contenido


Foto

Ayuda con función isdigit


  • Por favor identifícate para responder
6 respuestas en este tema

#1 bosoft

bosoft

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 05 junio 2013 - 12:57

Hola:
Aunque soy nuevo en este foro, hace años que lo leo. Soy forero activo del club builder.

Estoy retocando un componente TEdit al que le he añadido varias funciones numéricas, y esta escrito en delphi


delphi
  1. procedure TEditReal.Change;
  2. begin
  3.   if FResultado<>edTexto then
  4.     begin
  5.       if Text <> '' then
  6.       and 
  7. //  alguna de las 2 sentencias es correcta?
  8. //  o sugerencia
  9.       if Text[1]>='0' and Text[1]<='9' then  <-------- da error
  10.      
  11.       if isdigit(Text[1]) then
  12.  
  13.         try
  14.           FDoubleValue:=StrToFloat(Text);
  15.         except
  16.           FDoubleValue:=0.0;
  17.         end;
  18. //      end;
  19.   end
  20.   else FDoubleValue:=0.0;
  21.  
  22.   FIntegerValue:=Trunc(FDoubleValue);
  23.   inherited Change;
  24. end;


La función devuelve el valor double del Text en un Edit. Las teclas ya están filtradas antes de llegar a la función, pero a veces llega texto al cargar desde algún archivo externo
Para que StrToFloat no salte por los aires, me he propuesto filtrar el Text antes de la conversión, es decir, que solo hayan dígitos y para ello he probado con la primera letra de Text
En C++ no tendría ningún problema, pero a la hora de compilar el componente, el IDE 2007 se resiste.

¿Algún alma caritativa me echa un cable?

Gracias y Saludos
  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 05 junio 2013 - 01:36

isdigit comprueba si un caracter es numérico, no la cadena completa. Puedes comprobar que tu cadena en delphi solo tiene números recorriendola en un bucle...

En este caso quizás sea mejor probar con StrToFloatDef



delphi
  1. FDoubleValue:=StrToFloatDef (Text, 0.0);


Si falla el resultado es 0.0

Saludos.
  • 0

#3 bosoft

bosoft

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 05 junio 2013 - 01:48

Muchísimas gracias escafandra.

voy a probar tu sugerencia

saludos
  • 0

#4 bosoft

bosoft

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 06 junio 2013 - 12:40

Hola escafandra
Mira que llevo años con builder peleándome con los StrTo... y hasta ayer no sabia que existiera la función StrToFloatDef. Funciona correctamente y te quitas de golpe todos los dolores de cabeza para hacer filtros para evitar esos errores tan tontos que no existían en C con los duros y resistentes atoi y atof

Muchas gracias
  • 0

#5 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 06 junio 2013 - 01:58

Trabajando con Builder nada te impide usar las funciones C puras, de hecho yo prefiero hacerlo, sobre todo en las mas generales, por tema de portabilidad.  :)


Saludos.
  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 06 junio 2013 - 02:14

¿bosoft sabes que puedes usar muchas funciones de "C" en delphi?. Muchas de ellas están implementadas en la API de windows, no en vano la malloría están escritas en C.

ejemplo:



delphi
  1. function  atoi(str: PCHAR): Integer; cdecl external 'crtdll';



Saludos.
  • 0

#7 bosoft

bosoft

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 06 junio 2013 - 02:38

¿bosoft sabes que puedes usar muchas funciones de "C" en delphi?. Muchas de ellas están implementadas en la API de windows, no en vano la malloría están escritas en C.

ejemplo:



delphi
  1. function  atoi(str: PCHAR): Integer; cdecl external 'crtdll';



Saludos.

Pues no tengo eso tan claro, porque intenté usar el isdigit dentro del IDE y me decía función desconocida, pero a continuación me daba unos errores que no logré entender
Igual es posible que mi nulo entendimiento de delphi ayude un poquito a ello, aunque lo dudo  *-)

hablando en serio: No tengo ni idea de delphi. Pero literalmente. Me lio hasta con los begins esos

saludos y gracias escafandra
  • 0




IP.Board spam blocked by CleanTalk.