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)

Nomad 06-07-2007 23:32:43

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

Gracias

jhonny 06-07-2007 23:46:30

La verdad es que no conozco el TDBStringGrid, pero Con un TEdit se puede hacer asi:
Código Delphi [-]
 
var
  N :Integer;
begin
  N := StrToIntDef(Edit1.Text, -1);
  if N = -1 then
    ShowMessage('Letra')
  else
    ShowMessage('Numero');
end;
Si adecuas este ejemplo a lo que necesitas seguramente te sera útil. ;)

eduarcol 06-07-2007 23:54:10

No tengo delphi a mano ahorita pero tambien esta la funcion IsNumeric que devuelve true si es un numero

Código Delphi [-]
if IsNumeric(StringGrid1.Cells[x,y]) then

jhonny 06-07-2007 23:59:13

No se si me equivoco, pero tengo entendido que IsNumeric solo recibe como parámetro un Char, de manera que solo servirá para comprobar los números del 0 al 9.

eduarcol 07-07-2007 00:09:11

Por eso decia que no tenia delphi a mano de hecho lo escribi de memoria, es mas despues que postee me puse a pensar si no sera de otro lenguaje :confused:

jhonny 07-07-2007 00:24:11

Pero siempre podremos hacer nuestra función personalizada :D.
Código Delphi [-]
 
function TForm1.EsNumero(Numero: String): Boolean;
var
  i :Integer;
begin
  i := 0;
  Result := True;
  while ((i <= Length(Numero)-1) and (Result = True)) do
  begin
    inc(i);
    Result := IsNumeric(Numero[i]);
  end;
end;
Para usarla es:
Código Delphi [-]
 if EsNumero(StringGrid1.Cells[x,y]) then
  begin
    ShowMessage('Es Numerico¡');
  end
  else
  begin
    ShowMessage('Es Alfanumerico¡');
  end;

Nota: IsNumeric pertenece a la unidad IdGlobal.Pas

jhonny 07-07-2007 00:32:30

Un pequeño ajuste a esa función ya que si le envían '' me diría que es Numérico y si envían un numero negativo diría que es alfanumerico:
Código Delphi [-]
 
function TForm1.EsNumero(Numero: String): Boolean;
var
  i :Integer;
begin
  i := 0;
  Result := (Length(Numero)<>0);
  while ((i <= Length(Numero)-1) and (Result = True)) do
  begin
    inc(i);
    Result := (IsNumeric(Numero[i]) or (Numero[i]='-'));
  end;
end;

Seguro que esa función debe tener errores aun, pues no tiene en cuenta los flotantes o si le envian algo como -1222-566 tambien presentaria problemas, pero alli se las dejo por si alguien quiere refinarla.

eduarcol 07-07-2007 00:33:31

Buena esa jhonny :)

yo añadiria

Código Delphi [-]
function TForm1.EsNumero(Numero: String): Boolean;
var
  i :Integer;
begin
  i := 0;
  Result := (Length(Numero)<>0);
  while ((i <= Length(Numero)-1) and (Result = True)) do
  begin
    inc(i);
    Result := (IsNumeric(Numero[i]) or (Numero[i]='-') or (Numero[i]=DecimalSeparator) );
  end;
end;

eduarcol 07-07-2007 18:26:37

No la he probado pero esto deberia funcionar

Código Delphi [-]
function TTexto.EsNumero(cValor: String): Boolean
var
  i :Integer;
  nSigno, nSeparador: Integer;  //nSigno cuenta la cantidad de signos escritas debe ser solo uno nSimbolo la cantidad de simbolo decimal
begin
  i := 0;
  Result := (Length(cValor)>0);
  while ((i <= Length(cValor)-1) and (Result = True)) do
  begin
    inc(i);
    Result := (IsNumeric(cValor[i]) or ((cValor[i]='-') and (nSigno = 0)) or ((cValor[i]=DecimalSeparator) and (nSeparador = 0));
    //Determina si se escribio para incrementar el contador
    if (cValor[i]='-') then
       Inc(nSigno);
    if (cValor[i]=DecimalSeparator) then
       Inc(nSeparador);
  end;
end;

jhonny 07-07-2007 18:36:55

:D, Bueno, pero entonces el problema ahora sería porque el siguiente tampoco es un numero y dicha función dirá que si:

9999-

Este tipo de cosas son realmente curiosas :D.

jhonny 07-07-2007 18:41:50

Ahora el siguiente tendría problema también:

999-999

Caracoles, cada vez le encuentro mas problemas, creo que tendré que ponerme a buscar soluciones :).

eduarcol 07-07-2007 18:48:41

Cita:

Empezado por jhonny
Caracoles, cada vez le encuentro mas problemas, creo que tendré que ponerme a buscar soluciones :).

jajaja pues bienvenida sea la ayuda, pero creo que la solucion es facil

Código Delphi [-]
function TTexto.EsNumero(cValor: String): Boolean
var
  i :Integer;
  nSigno, nSeparador: Integer;  //nSigno cuenta la cantidad de signos escritas debe ser solo uno nSimbolo la cantidad de simbolo decimal
begin
  i := 0;
  Result := (Length(cValor)>0);
  while ((i <= Length(cValor)-1) and (Result = True)) do
  begin
    inc(i);
    Result := (IsNumeric(cValor[i]) or ((cValor[i]='-') and (nSigno = 0) and (i = 1)) or ((cValor[i]=DecimalSeparator) and (nSeparador = 0));
    //Determina si se escribio para incrementar el contador
    if (cValor[i]='-') then
       Inc(nSigno);
    if (cValor[i]=DecimalSeparator) then
       Inc(nSeparador);
  end;
end;

Ahora solo falta saber si le sirvio la respuesta a nomad para pasarle la factura jejeje

jhonny 07-07-2007 19:00:35

Jejeje, no he probado tu solución aun pero me imagino que con el siguiente dirá que es numero

9999. //Nunca he visto un numero con ese punto al final :D

jhonny 07-07-2007 19:07:15

Que tal asi?, la probé y funciono, con las condiciones que hemos nombrado hasta aquí:

Código Delphi [-]
var
  i :Integer;
  nSigno, nSeparador: Integer;  //nSigno cuenta la cantidad de signos escritas debe ser solo uno nSimbolo la cantidad de simbolo decimal
begin
  i := 0;
  nSigno := 0;
  nSeparador := 0;
  Result := (Length(cValor)>0);
  while ((i <= Length(cValor)-1) and (Result = True)) do
  begin
    inc(i);
    Result := (IsNumeric(cValor[i]) or ((cValor[i]='-') and (nSigno = 0) and (i = 1)) or ((cValor[i]=DecimalSeparator) and (nSeparador = 0) and (i <> Length(cValor))));
    //Determina si se escribio para incrementar el contador
    if (cValor[i]='-') then
       Inc(nSigno);
    if (cValor[i]=DecimalSeparator) then
       Inc(nSeparador);
  end;

jhonny 07-07-2007 19:09:52

Cita:

Empezado por eduarcol
Ahora solo falta saber si le sirvio la respuesta a nomad para pasarle la factura jejeje

Jejeje, Cierto¡¡¡, Ojala le sirva una de tantas cosas que hemos dicho aquí :).

eduarcol 07-07-2007 19:14:14

Aja mas problemas a ver a ver

jhonny 07-07-2007 19:24:37

Cita:

Empezado por eduarcol
Aja mas problemas a ver a ver

Solo una cosa, ¿El siguiente debería considerarse como numero? (Omitiendo las comillas),
"999 " (Con espacio al final, por ejemplo).
Esa función dirá que es alfanumérico. Pero la siguiente no.

Código Delphi [-]
 
function TTexto.EsNumero(cValor: String): Boolean;
var
  i :Integer;
  nSigno, nSeparador: Integer;  //nSigno cuenta la cantidad de signos escritas debe ser solo uno nSimbolo la cantidad de simbolo decimal
begin
  cValor := Trim(cValor);
  i := 0;
  nSigno := 0;
  nSeparador := 0;
  Result := (Length(cValor)>0);
  while ((i <= Length(cValor)-1) and (Result = True)) do
  begin
    inc(i);
    Result := (IsNumeric(cValor[i]) or ((cValor[i]='-') and (nSigno = 0) and (i = 1)) or ((cValor[i]=DecimalSeparator) and (nSeparador = 0) and (i <> Length(cValor))));
    //Determina si se escribio para incrementar el contador
    if (cValor[i]='-') then
       Inc(nSigno);
    if (cValor[i]=DecimalSeparator) then
       Inc(nSeparador);
  end;
end;

eduarcol 07-07-2007 20:01:53

Ok jhonny hoy tengo el cerebro en off por mas qe trato le busco problemas y no se me ocurre ni uno jejeje

creo que me gusta mas pensar en soluciones que en problemas

jhonny 07-07-2007 20:08:27

Cita:

Empezado por eduarcol
Ok jhonny hoy tengo el cerebro en off por mas qe trato le busco problemas y no se me ocurre ni uno jejeje

creo que me gusta mas pensar en soluciones que en problemas

Bueno, la naturaleza humana es la que hace que seamos optimistas en estos casos ;). Seguramente si no tuvieramos esa actitud nunca hubiéramos inventado algo. :D

gabrielkc 07-07-2007 20:22:35

Código Delphi [-]
function EsNumero(cValue: string):Boolean;
var i,Estado:Byte;
begin
 if Length(cValue)>0 then
  Estado:=1
 else
  Estado:=0;
 i:=1;
 while (i<=Length(cValue))and(Estado<>0) do
  begin
    case Estado of
     1:case cValue[i] of
        '0'..'9':Estado:=2;
        '-':Estado:=3;
        else Estado:=0;
       end;
     2:case cValue[i] of
        '0'..'9':Estado:=2;
       '.':Estado:=4;
       '-':Estado:=0;
        else Estado:=0;
       end;
     3:case cValue[i] of
       '0'..'9':Estado:=2;
        else Estado:=0;
       end;
     4:case cValue[i] of
        '0'..'9':Estado:=5;
        else Estado:=0;
       end;
     5:case cValue[i] of
        '0'..'9':Estado:=5;
        else Estado:=0;
       end;
    end;
   Inc(i)
  end;
 Result:=(Estado in [2,5])
end;
Con un Autómata

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
 if EsNumero(edit1.Text) then
  ShowMessage('si')
 else
  ShowMessage('no')
end;
Así se llamaría, si no me equivoco...... funciona en todos los casos.


La franja horaria es GMT +2. Ahora son las 02:38:52.

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