Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-09-2006
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Poder: 19
elcigarra Va por buen camino
Saber si un texto es un número

Existe alguna función para saber si un texto represanta algún número sin tener que recurrir al control de excepciones?
ej:
Código:
var
  Numero : string
begin
  if isNAN(StrToFloat(Numero)) then
   //.......
En este caso la función StrToFloat eleva una excepción de punto flotante. La pregunta es si existe alguna función que evalúe el texto antes de intentar realizar la operación...
Responder Con Cita
  #2  
Antiguo 29-09-2006
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Poder: 19
elcigarra Va por buen camino
perdón... en el ejemplo anterior supongan que a la variable número le doy un valor (que no sea un número) antes de la función "isNaN". Ya sé que no estaba inicializada en el ejemplo
Responder Con Cita
  #3  
Antiguo 29-09-2006
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Este es parte de un ejemplo que puso Bicho en algun hilo.
En El evento OnKeyPress del edit o dbedit pon:
Código Delphi [-]
if key in ['0'..'9'] then
// Aqui pones lo que neceitas
Con esto si hay algun numero lo indica
Hay que buscar para encontrar
Saludos
Responder Con Cita
  #4  
Antiguo 29-09-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Podemos hacer algo así:
Código Delphi [-]
var
  Numero: String;
  Valor: Extended;
begin
  Numero:= '1,25';
  if TextToFloat(PChar(Numero),Valor,fvExtended) then
  begin
    // Aqui lo que quieras
  end;
end;
Responder Con Cita
  #5  
Antiguo 29-09-2006
menavas menavas is offline
Registrado
 
Registrado: ago 2006
Posts: 7
Poder: 0
menavas Va por buen camino
buenas, yo utilizaria un bloque try... except


Código Delphi [-]
 try
  strtoint(key)
except
 //Colocas tu codigo para manejar la excepcion
end;
saludos!
Responder Con Cita
  #6  
Antiguo 29-09-2006
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Ya que estas por aqui seoane, quisiera que me evacuaras una consulta con respecto al codigo que pusiste.
Al usar variables, no estoy utilizando memoria adicional?
El uso de variables es mejor limitarlo o por el contrario un bite o mas no son gran desplome ?
Perdona que te haga esta pregunta en este hilo, pero se dio la ocasion.
Saludos Maestro
Responder Con Cita
  #7  
Antiguo 29-09-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Lo siento Caral, pero no te entiendo muy bien. A que te refieres con "usar variables". Y cuando dices que usa mas memoria, ¿con resecto a que otro metodo?.
Responder Con Cita
  #8  
Antiguo 29-09-2006
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Gracias Seoane
Dicen que la pregunta mas tonta es la que no se hace
Al Hacer esto:
Código Delphi [-]
var
  Numero: String;
  Valor: Extended;
No Estas utilizando una Variable de tipo string?( Cadena de caracteres), que a su vez ocupa bytes de memoria?, puesto que el sistema tiene que almacenar (Guardar o Guardar espacio) para esta variable para definir posteriormente, (Fraccion de segundos) su valor?
La verdad seoane es simple curiosidad y tratar de aprender algo mas.
Saludos
Responder Con Cita
  #9  
Antiguo 29-09-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Ahora creo que ya se por donde vas, donde yo pongo:
Código Delphi [-]
  Numero:= '1,25';
  if TextToFloat(PChar(Numero),Valor,fvExtended) then

preguntas por que no uso:
Código Delphi [-]
  if TextToFloat('1,25',Valor,fvExtended) then

Lo hago por seguir el ejemplo que puso elcigarra:
Código Delphi [-]
var
  Numero : string
begin
  if isNAN(StrToFloat(Numero)) then

Con respecto a tu pregunta, la diferencia entre una y otra cosa es insignificante. Estamos hablando de microsegundos.
Responder Con Cita
  #10  
Antiguo 29-09-2006
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Gracias
La verdad esto es lo que me gusta de este club y sus foros que una pregunta o una duda se puede convertir en un debate y creo que de eso se trata espero que con ampliar estas posibilidades elcigarra y otros muchos tengan mas criterio y enfonquen sus dudas con mas amplitud.
Repito Gracias por tu explicacion he insisto, Maestro.
Saludos
Responder Con Cita
  #11  
Antiguo 29-09-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por seoane
la diferencia entre una y otra cosa es insignificante. Estamos hablando de microsegundos.
Además en muchos casos el compilador de hecho desechará la variable. Y aún si no fuese el caso, yo prefiero "desperdiciar" unos cuantos a bytes y ganar legibilidad de código.

// Saludos
Responder Con Cita
  #12  
Antiguo 29-09-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por seoane
TextToFloat
Por cierto, ¿algúna razón en especial para no usar TryStrToFloat o es sólo un gusto por los PChar?

// Saludos
Responder Con Cita
  #13  
Antiguo 29-09-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por roman
Por cierto, ¿algúna razón en especial para no usar TryStrToFloat o es sólo un gusto por los PChar?

// Saludos
Ya sabes que los punteros me encantan, pero en este caso lo hice por si la función TryStrToFloat no estaba disponible en esa versión de delphi que el utilizaba.
Responder Con Cita
  #14  
Antiguo 29-09-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Los pchar son a los string lo que los palillos chinos al tenedor. Se pueden hacer maravillas con los primeros pero es mucho, mucho más cómodo usar los segundos.



// Saludos
Responder Con Cita
  #15  
Antiguo 29-09-2006
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Denuevo:
La pregunta existencial.
Si nuestro amigo elcigarra pregunta a mi entender:
Cita:
La pregunta es si existe alguna función que evalúe el texto antes de intentar realizar la operación...
y en el primer parrafo dice en concreto:
Cita:
saber si un texto represanta algún número sin tener que recurrir al control de excepciones
Mi respuesta fue incorreta?, para anotarla en mi lista de fallos.
Cita:
En El evento OnKeyPress del edit o dbedit pon:
Código Delphi [-]
if key in ['0'..'9'] then
// Aqui pones lo que necesitas
Puesto que si por limpieza y rapidez de codigo se trata, esto es rapido seguro.
Maestros por favor me critican asi aprendo.
Saludos
Responder Con Cita
  #16  
Antiguo 29-09-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Son dos cosas distintas. Lo que tú propones sirve para permitir que se tecleen sólamente dígitos dentro de algún control. Pero en la pregunta original no se menciona ningún control en particular; el dato puede provenir de otro tipo de fuentes, por ejemplo, de un archivo de texto.

// Saludos
Responder Con Cita
  #17  
Antiguo 29-09-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
En tu caso estás comprobando que un caracter 'X' se encuentre en el rango dado...

Y lo que necesita elcigarra es comprobar si un string dado representa a un número.

Así que no aplicaría...


Saludos...


Actualización: Que me han ganado...
Responder Con Cita
  #18  
Antiguo 29-09-2006
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Caral, no te preocupes por "gastar memoria" tan pronto.

Usar variables es el metodo recomendado para la mayoria de los casos, y ten en cuenta que los compiladores se optimizan para los casos "genericos".

Cuando alguien hace algo no "generico" el compilador (ejem... los arquitectos del compilador) lo que hace es decir: ok, se supone que el tio es mas listo que yo.

Y la gran mayoria de los casos, no lo son.

Ademas en Delphi Nativo (Win32/Win64) los tipos de datos string son mutables y son punteros, lo que implica que son muuuy eficientes. De hecho, pascal tiene el mejor tipo de datos string, a la hora de balancear asuntos.

Otro caso es sobre .NET y otros lenguajes, que tienen datos inmutables, o sea, cada referencia es una copia de la anterior, no un puntero.

Y aun asi, es negible el efecto.

Las mejores optimizaciones se logran:

- Haciendo codigo claro, que siga las convenciones, y que trabaje de forma "normal" sin pretender ser muy listo antes de serlo de verdad.

- Reducir la cantidad de codigo, la cantidad de funciones, etc... Simple es mejor que complejo.

- El 80% de los problemas esta en el 20% del codigo. El codigo mas repetitivo es el que *vale* la pena chequear para optimizar y refactorizar.

- Antes de optimizar, usa un profiler. La mayoria de los programadores aprendemos tecnicas de optimizaciones (como pasar un for a un while) que son innecesarias en compiladores modernos, o que no corresponden a la arquitectura (ej: Aplicar optimizaciones Win32 a .NET). Solo al usar profilers sabras que es lento.

- La velocidad perceptual es mas importante que la de maquina. Un software que le parezca al usuario mas lento es peor que uno que lo sea tecnicamente mas rapido.

La optimizacion se logra haciendo un buen codigo visual...

Una vez *tu* seas eficiente en desarrollar, preocupate por que lo sea tu software, porque sino terminaras haciendo un trabajo innecesario.
__________________
El malabarista.
Responder Con Cita
  #19  
Antiguo 29-09-2006
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Gracias maestros, a todos , puesto que si no se hacen preguntas, ahunque sean tontas, no se aprenderia.
Pd. elcirrara: No sirve mi opcion
Reconozco mi error y les doy las gracias por su enseñanza y paciencia, que en los tres meses que llevo programando he aprendido mucho con vosotros.
Saludos
Responder Con Cita
  #20  
Antiguo 29-09-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Por otro lado Caral aunque estés usando un TEdit para introducir el numero, y utilizaras el evento OnKeypress para filtrar los números, eso no nos asegura que el resultado pueda ser convertido a un numero. Por ejemplo, el numero 5000000000 pasaría tu filtro, pero no se puede convertir en integer. Por eso siempre es recomendable hacer la comprobación, mas vale 10 comprobaciónes de mas que una de menos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Saber el número de serie de la placa fer21unmsm Varios 3 30-12-2005 18:36:51
como saber el numero de renglones ddd_ddd OOP 4 27-10-2005 21:27:56
Saber numero de usuarios a un alias oscjae Conexión con bases de datos 1 16-05-2005 19:26:15
Quickreport Imprimir Texto procedente de BDD sin saber el numero de lineas Javier Buendia Impresión 1 22-02-2005 07:13:23
Saber el numero de caracteres de un memo judoboy Varios 1 20-06-2003 14:27:19


La franja horaria es GMT +2. Ahora son las 07:37:10.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi