Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Saber si es un numero (https://www.clubdelphi.com/foros/showthread.php?t=45562)

egostar 07-07-2007 20:46:47

He estado observando todos los post, pero me parece que nos estamos liando.

Según lo que comenta incialmente Nomad

Cita:

Empezado por Nomad
Como hace uno para saber si lo que estoy leyendo de un dbstringgrid es un numero o una letra?

Esto sugiere (desde mi mente cochambrosa:D) que quiere saber el contenido de todo el DBStringGrid, no caracter por caracter, aunque puede ser que solo sea un caracter y no una cadena, o si, no se, seria cosa de que apareciera y nos diera mas información. :rolleyes:

Creo que la respuesta debería ser mas simple.

Aqui les dejo el código, probado con las diferentes posibilidades.

Código Delphi [-]
{
Posibilidades.

1)  StringGrid1.Cells[1,1] := '-123456-754333';
2)  StringGrid1.Cells[1,1] := '-123456754333';
3)  StringGrid1.Cells[1,1] := '123456754333';
4)  StringGrid1.Cells[1,1] := 'A1B2C3d4C5';
}

  Try
    StrtoFloat(StringGrid1.Cells[1,1])
  except
    ShowMessage('No es número');
  end;

Salud OS.

eduarcol 07-07-2007 20:57:25

No se si son manias o es que lo lei pero el asunto es que no me gusta crear excepciones que pueden ser evitadas.

jejej ademas si no nos hubieramos liado asi luego en que entretenernos

egostar 07-07-2007 21:03:51

Cita:

Empezado por eduarcol
No se si son manias o es que lo lei pero el asunto es que no me gusta crear excepciones que pueden ser evitadas.

jejej ademas si no nos hubieramos liado asi luego en que entretenernos

:D:D:D, pues si es bonito hacer trabajar la mente torcida, sin embargo, hay que evaluar los costos de evitar una excepción.

En fin, cada perro tiene su método para matar pulgas.:D:D

Salud OS.

jhonny 07-07-2007 21:21:01

Hay diosssss, a veces me parece que debí dejar todo en el primer post que escribí (Que por cierto es muy parecido al codigo que acaba de escribir egostar). :D, pero otra veces me doy cuenta de que me he divertido con este hilo :p .

Delphius 07-07-2007 21:30:32

He estado siguiendo a este hilo y la verdad es que como que le dieron demasiada rosca al asunto:D.

Cita:

Empezado por eduarcol
No se si son manias o es que lo lei pero el asunto es que no me gusta crear excepciones que pueden ser evitadas.

Es cierto, si se puede evitar el asunto de las excepciones. Conviene.

Ahora, para encabronar, y seguir dandole rosca... ¿alguno no pensó el emplear la antigua función val()?

Con esto simplemente podríamos hacer algo así (que también es rebuscado ya que por esas dos líneas directamente conviene meterle un IF) :

Código Delphi [-]
function EsNumero(Numero: string): boolean;
var
  Chequeo, Num: integer;
begin
   val(Numero, Num, Chequeo);
   result := (Chequeo = 0);
end;

Saludos,

jhonny 07-07-2007 21:36:16

Delphius, Pues efectivamente dice que 13.5 es Alfanumérico :( :D

eduarcol 07-07-2007 21:42:34

Cita:

Empezado por egostar
He estado observando todos los post, pero me parece que nos estamos liando.

Cita:

Empezado por Delphius
He estado siguiendo a este hilo y la verdad es que como que le dieron demasiada rosca al asunto.


Sinceramente es pasion por ver sufrir al projimo :P


Ok val sirve para los enteros, ¿¿y los reales?? que son los que le dieron vuelta al asunto

jhonny 07-07-2007 21:46:23

Cita:

Empezado por eduarcol
Sinceramente es pasion por ver sufrir al projimo :P

Estoy de acuerdo contigo eduarcol, ¡¡¡ Que cosita ola!!! :D:D:D

Delphius 07-07-2007 21:53:26

Cita:

Empezado por eduarcol
Ok val sirve para los enteros, ¿¿y los reales??

¿Estas completamente seguro?
Fui a la ayuda y me di con esto:

Cita:

Empezado por ayuda
Val converts the string value S to its numeric representation, as if it were read from a text file with Read.
S is a string-type expression; it must be a sequence of characters that form a signed real number.
V is an integer-type or real-type variable.

Para que funcione volví a la función y la alteré por esta:

Código Delphi [-]
function EsNumero(Numero: string): boolean;
var
  Chequeo: integer;
  Num: real;
begin
   val(Numero, Num, Chequeo);
   result := (Chequeo = 0);
end;

Saludos,

eduarcol 07-07-2007 21:55:22

Upps :o que de cosas, yo lei lo mismo pero no se en que estaba pensando y en vez de real lo modifique por double, bueno es sabado las 4 de la tarde y en lo noche me toca viajar debe ser eso que me tiene la cabeza en otra parte

jhonny 07-07-2007 22:03:02

Ya decia yo que alguien iba a venir he íbamos a tener que tirar todo a la basura :D, el único "problema" que veo es que parece que obliga a que se use como Separador decimal el Punto(.), de manera pues que si alguien esta acostumbrado a usar la coma (,) tendrá que cambiar de costumbres, ahh y volvió otro problema que ya habíamos evaluado, que el 999. (Con ese punto al final) no es valido :).

Jejeje, parece que estuviéramos volviendo a lo mismo :D.

jhonny 07-07-2007 22:09:43

Bueno, fue muy divertido este asunto y gracias a Delphius por fin se pudo sacar una función muy bonita, asi pues que propongo finalmente este otro ajustecito y listo :D...

Código Delphi [-]
 
function EsNumero(Numero: string): boolean;
var
  Chequeo: integer;
  Num: real;
begin
   Numero := Trim(Numero);
   val(Numero, Num, Chequeo);
   result := ((Chequeo = 0) and (Numero[Length(Numero)]<> '.'));
end;

egostar 07-07-2007 22:10:42

Cita:

Empezado por jhonny
Ya decia yo que alguien iba a venir he íbamos a tener que tirar todo a la basura :D, el único "problema" que veo es que parece que obliga a que se use como Separador decimal el Punto(.), de manera pues que si alguien esta acostumbrado a usar la coma (,) tendrá que cambiar de costumbres, ahh y volvió otro problema que ya habíamos evaluado, que el 999. (Con ese punto al final) no es valido :).

Jejeje, parece que estuviéramos volviendo a lo mismo :D.


:D:D, Si prueban con mi código, ya tiene contemplado los números que mencionas amigo jhonny.

Lo de las comas, :rolleyes:, se resuelve con la funcion:

Código Delphi [-]
StringReplace(NombreCampo,',','',[rfReplaceAll]);

:D:D

Salud OS.

jhonny 07-07-2007 22:20:28

Cita:

Empezado por egostar
:D:D, Si prueban con mi código, ya tiene contemplado los números que mencionas amigo jhonny.

Lo de las comas, :rolleyes:, se resuelve con la funcion:



StringReplace(NombreCampo,',','',[rfReplaceAll]);

:D:D



Salud OS.

Jejeje, definitivamente esto si esta muy divertido, en ultimas todos tenemos algo de razón, tu dices que hay que cerciorarse de los costos vs access violations y tales y que pascuales y ya somos 4 invirtiéndole a esta solución :D, mientras que cierto personaje debe estar en casa con pantaloneta, tirado en su sillón viendo alguna buena pelicula de sábado con su familia :D.

Mi función en ese caso es:

Código Delphi [-]
 
StringReplace(DondeDeboEstar,'Oficina','Hogar',[rfReplaceAll]);

:D :D :D

eduarcol 07-07-2007 22:38:28

Jajajajajajaja pues si definitivamente el amigo jhonny tiene una obsesion secreta con el 999. que realmente si es un numero, valdria decir

999 = 999. = 999.0

Pues yo ya llegue de la oficina a la casa pero no se preocupen aqui tengo tambien una oficina y hecha por mis propias manos vamos que hasta presentable me ha quedado, aunque sigo esperando que no se caiga, y el arquitecto y que si bases que si pilares que si cabilla, nah cemento y bloque jejeje

Delphius 08-07-2007 00:57:28

Pues me he quedado un poco "picado", y se me ocurrió lo siguiente:

Código Delphi [-]
function Tform1.EsNumero(Numero: string; SepDecimal: char = '.'): boolean;
// Esta función ha sido diseñada para seguir dando rosca al asunto
// Espero que le sea de su agradado
const
  PUNTO = '.';
var
  Chequeo: integer;
  Num: real;
begin
   Numero := Trim(Numero);
   // Si usa otro separador... lo sustiuimos por el punto para
   // que se pueda transformar...
   // quien sabe, en una de esas puede existir algún planeta
   // en donde el separador sea el @
   if SepDecimal <> PUNTO
      then Numero := StringReplace(Numero,SepDecimal,PUNTO,[rfReplaceAll]);
   val(Numero, Num, Chequeo);
   result := ((Chequeo = 0) and (Numero[Length(Numero)]<> '.'));
end;

// Ejemplo de uso
procedure TForm1.Button1Click(Sender: TObject);
begin
  if EsNumero('999,75',',')
     then ShowMessage('Es un número')
     else ShowMessage('En este planeta eso no es un número');
end;

Saludos,

eduarcol 08-07-2007 01:01:38

Cita:

Empezado por Delphius
Pues me he quedado un poco "picado",

JEJEJE entonces ya estas entendiendo de que venia el hilo

muy buena tu funcion mañana la pruebo y veo que tal, por los momentos que pasaria con 999,999.99

o el dilema de jhonny de 99.

courtois 08-07-2007 07:58:59

por que no pruebas con las funciones TryStrToInt o TryStrToFloat? ambas devuelven true si es posible convertir str en un numero entero o flotante

jhonny 09-07-2007 14:57:49

Cita:

Empezado por courtois
por que no pruebas con las funciones TryStrToInt o TryStrToFloat? ambas devuelven true si es posible convertir str en un numero entero o flotante

No les decia yo?

Parece que todo quedo reducido en esa función, incluso tiene en cuenta el 999. :D

Código Delphi [-]
 
var
  Numero :Extended;
begin
   if TryStrToFloat(Edit1.Text, Numero) then
     ShowMessage('Numero¡¡¡')
   else
     ShowMessage('AlfaNumero¡¡¡');
end;
Lo que me produce un "no se que" que no se describir, es que en http://www.clubdelphi.com/foros/show...1772#post71772 ya había algo :D. Que curioso...

¡¡¡Buena esa courtois!!!

egostar 09-07-2007 17:20:35

Pues el compañero nomad ya tiene opciones para decidir, pero, a todo esto, donde estará que no ha dicho ni pio.

Bajo estas circunstancias me viene a la mente esto que escribió nuestro amigo jhonny....

Cita:

Empezado por jhonny
...definitivamente esto si esta muy divertido, en ultimas todos tenemos algo de razón, tu dices que hay que cerciorarse de los costos vs access violations y tales y que pascuales y ya somos 4 invirtiéndole a esta solución :D, mientras que cierto personaje debe estar en casa con pantaloneta, tirado en su sillón viendo alguna buena pelicula de sábado con su familia :D.

:D:D:D

Salud OS.


La franja horaria es GMT +2. Ahora son las 10:53:33.

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