Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   No se reconoce el signo de %, Pascal (https://www.clubdelphi.com/foros/showthread.php?t=91952)

angelratza 09-06-2017 19:44:25

No se reconoce el signo de %, Pascal
 
Hola a todos, verán soy nuevo en esto de programar con delphi pascal, por lo que me acerco a ustedes con un problema. :D

Tengo un programa que tiene hechas funciones para el conteo y obtención de los valores de una cadena, pero el problema es que no me reconoce el símbolo de % como separador entre las partes de dicha cadena.
Les dejo el código para ver si alguien me puede ayudar a identificar el error que tengo y lograr que lo reconozca como un carácter para separar los valores.

qP:-) Funciones utilizadas:
Código Delphi [-]
   function EsStrunNumero(NumStr : string) : bool;
   begin
    result := true;
    try
      StrToInt(NumStr);
    except
      result := false;
    end;
   end;

   function GetToken(Cadena:string; Separador:char; Token:integer):string; overload
   {
   Cadena     es la string en la que buscar el token
   Separador  es la string que separa cada token
   Token      es el número de token que buscamos

   Cadena     is the string in that look for the token
   Separador  is the token separator
   Token      is the desired token number
   }
   var
     Posicion:integer;
   begin
      while Token > 1 do begin
        Delete(Cadena,1,Pos(Separador,Cadena));
        Dec(Token);
      end;
      Posicion:=Pos(Separador,Cadena);
      if Posicion=0
      then result:=cadena
      else Result:=Copy(Cadena,1,Posicion-Length(Separador));
   end;

   function GetTokenCount(Cadena:string; Separador:char):integer; overload;
   var
      Posicion:integer;
   begin
     Posicion:=Pos(Separador,Cadena);
     Result:=1;

     if Cadena <> '' then begin
       if Posicion <> 0 then begin
         while Posicion <> 0 do
         begin
           Delete(Cadena,1,Posicion);
           Posicion:=Pos(Separador,Cadena);
           Inc (Result);
         end;
       end;
     end else Result:=0;
   end;
!!!:-| Parte del programa con el conflicto:
Código Delphi [-]
       IF GetTokenCount(texto,'%') = 2 then //cuando hay 2 tokens con signo de %
          begin
            if (EsStrunNumero(GetToken(texto,'%',1))) and (EsStrunNumero(GetToken(texto,'%',2)))then
            begin
              idesc:= StrToInt(GetToken(texto,'%',1));//Con esta funcion se obtiene el 1er. token que es el 
                                                      //porcentaje de descuento y la colocamos a iDesc
              scve:= GetToken(texto,'%',2);   //Con esta Funcion se obtiene el 2o. token que es la clave de 
                                              //producto y se deposita en scve

                  reng:=Fventa.SGVenta.RowCount; //Parte de una rejilla en donde se muestran los datos
                  importdesc:=StrToFloat(Fventa.SGVenta.Cells[6,reng-1]); // Obtenemos el valor del importe 
                                                              // sin descuento

                  if idesc <> 0 then
                  begin
                    Desc:=1-idesc/100; //a 1 se resta el porcentaje de descuento para q Desc se multiplique por la cantidad
                    import:=importdesc*Desc;
                    Fventa.SGVenta.Cells[5,reng-1]:= IntToStr(idesc); // Descto
                  end;
              end; 
           end;
Agradezco de antemano el apoyo que dan en este sitio y quedo atento de sus comentarios para resolverlo. :)
Saludos. ^\||/

ecfisa 09-06-2017 20:34:29

Hola.

Desconozco los valores que envías a las funciones, pero revisé a GetToken y GetTokenCount y de este modo me funcionan como se esperaría:
Código Delphi [-]
function GetTokenCount( Cadena:string; Separador:Char ): Integer; overload;
var
  Posicion:integer;
begin
  Result := 0;
  if Cadena <> '' then
  begin
    Posicion := Pos( Separador, Cadena );
    while Posicion <> 0 do
    begin
      Delete( Cadena, 1, Posicion );
      Posicion := Pos( Separador, Cadena );
      Inc( Result );
    end;
  end;
end;

function GetToken( Cadena:string; Separador:char; Token:integer ): string; overload
var
  Posicion:integer;
begin
  while Token > 1 do
  begin
    Delete( Cadena, 1, Pos( Separador,Cadena ) );
    Dec( Token );
  end;
  Posicion := Pos( Separador, Cadena );
  if Posicion = 0 then
    Result := Cadena
  else
    Result := Copy( Cadena, 1, Posicion-Length( Separador ) );
end;


Codigo de prueba:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
  i,x: Integer;
begin
  
  s := '';
  for i := 100 to 110 do  s := s+ IntToStr( i )+'%';
  SetLength(s, Length( s )-1);  // 100%101%...%110

  ListBox1.Items.Add( s );
  ListBox1.Items.Add( StringOfChar('-', 43) );

  x := GetTokenCount( s, '%' );
  for i := 1 to x do ListBox1.Items.Add( GetToken( s,'%', i ) );
end;

Resultado:


Saludos :)

angelratza 09-06-2017 22:26:10

Gracias ecfisa por responder :), y veras tengo un campo TEdit desde donde se están ingresando los valores de la variable "texto", pero al momento de ejecutar la función de GetTokenCount esta no reconoce el signo de % como un separador, si no lo toma como si estuviera toda la cadena en un solo valor.

!!!:-|Comparto parte del código en donde se hace esto:

Código Delphi [-]
procedure TFVenta.EdVentaKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  idesc, reng, icant, grs, I:integer;
  scve, texto, import2, flag:string;
  Desc, import, importotal, importdesc:real;
begin
  if key = vk_RETURN then // al momento de dar enter sobre el campo en de donde se obtienen los valores....
  begin
    if FVenta.Caption <> 'Devolucion de Productos' then /// verifica que estemos en el form correcto.
    begin
      if Fventa.EdVenta.Text = '' then
      begin
        FVenta.EdGramos.SetFocus;  // si esta vació el campo lo manda al siguiente campo del formulario
      end
      Else
      begin
        texto:=FVenta.EdVenta.Text; // si no esta vacio toma los datos escritos en el campo TEdit p/e: 10%251025

         IF GetTokenCount(texto,'%') = 2 then //cuando hay 2 tokens con signo de %
          begin
            if (EsStrunNumero(GetToken(texto,'%',1))) and (EsStrunNumero(GetToken(texto,'%',2)))then // verifica que sean numeros los valores ingresados
            begin
              idesc:= StrToInt(GetToken(texto,'%',1));//Con esta funcion se obtiene el 1er. token que es el porcentaje de descuento y la colocamos a iDesc 
              scve:= GetToken(texto,'%',2);   //Con esta Funcion se obtiene el 2o. token que es la clave de producto y se deposita en scve

                  if idesc <> 0 then // si el descuento a aplicar no es 0 se realizan las operaciones
                  begin
                    Desc:=1-idesc/100; //a 1 se resta el porcentaje de descuento para q Desc se multiplique por la cantidad
                    import:=importdesc*Desc; // se aplica el descuento al importe actual
                    Fventa.SGVenta.Cells[5,reng-1]:= IntToStr(idesc); // se toma el valor del descuento para mostrarlo
                  end;

                  import2:=FormatFloat('#,##0.00',import); // se le da formato al resultado del importe ya con descuento aplicado
                  Fventa.SGVenta.Cells[6,reng-1]:= import2; // se muestran los datos del resultado del importe
            end;
          end;
       end;
     end;
  end;
end;

:confused: que crees que pudiera ser que no me reconozca el signo como un separador, por que veo que en la prueba que realizaste si que lo reconoce como un separador.
Saludos. ^\||/

Casimiro Notevi 09-06-2017 23:13:08

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

cloayza 09-06-2017 23:29:45

Mirando el código creo que el problema es tu función

Cadena=100%200%300
Separador=%

GetTokenCount debería retornar 2, pero retorna 3, porque?

En color rojo está el problema, lo inicializas en 1, cuando encuentra los dos % el total es 3 y tu estas preguntando por un valor igual a 2 acá "IF GetTokenCount(texto,'%') = 2 then //cuando hay 2 tokens con signo de %"

Código Delphi [-]
function GetTokenCount(Cadena:string; Separador:char):integer; overload;
   var
      Posicion:integer;
   begin
     Posicion:=Pos(Separador,Cadena);
     Result:=1;

     if Cadena <> '' then begin
       if Posicion <> 0 then begin
         while Posicion <> 0 do
         begin
           Delete(Cadena,1,Posicion);
           Posicion:=Pos(Separador,Cadena);
           Inc (Result);
         end;
       end;
     end else Result:=0;
   end;

Es por so que la función del gran Ecfisa :D funciona bien...

Saludos cordiales

angelratza 09-06-2017 23:51:34

Cita:

Empezado por Casimiro Notevi (Mensaje 518014)
Recuerda poner los tags al código fuente, ejemplo:

Gracias :)

Lo estaré haciendo así, gracias por la indicación. :D


La franja horaria es GMT +2. Ahora son las 07:50:04.

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