Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Saber si un texto es un número (https://www.clubdelphi.com/foros/showthread.php?t=36037)

elcigarra 29-09-2006 20:02:57

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...

elcigarra 29-09-2006 20:04:29

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

Caral 29-09-2006 20:13:48

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:D
Saludos

seoane 29-09-2006 20:15:50

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;

menavas 29-09-2006 20:18:28

buenas, yo utilizaria un bloque try... except


Código Delphi [-]
 try
  strtoint(key)
except
 //Colocas tu codigo para manejar la excepcion
end;
saludos!:)

Caral 29-09-2006 20:21:37

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

seoane 29-09-2006 20:27:06

:confused: 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?.

Caral 29-09-2006 20:34:28

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

seoane 29-09-2006 20:41:32

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.

Caral 29-09-2006 20:47:42

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

roman 29-09-2006 20:48:48

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

roman 29-09-2006 21:19:00

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? :p

// Saludos

seoane 29-09-2006 21:27:37

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? :p

// Saludos

:D 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.

roman 29-09-2006 21:30:38

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.

:D

// Saludos

Caral 29-09-2006 22:13:03

Denuevo:
La pregunta existencial.:D
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?,:confused: para anotarla en mi lista de fallos.:mad:
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.:D
Maestros por favor me critican asi aprendo.:D
Saludos

roman 29-09-2006 22:17:37

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

maeyanes 29-09-2006 22:18:46

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... :p

mamcx 29-09-2006 22:20:45

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.

Caral 29-09-2006 22:25:57

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

seoane 29-09-2006 22:29:38

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 :)


La franja horaria es GMT +2. Ahora son las 04:18:15.

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