Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-06-2017
angelratza angelratza is offline
Registrado
NULL
 
Registrado: jun 2017
Posts: 8
Poder: 0
angelratza Va por buen camino
Exclamation 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.

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.

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.

Última edición por ecfisa fecha: 09-06-2017 a las 20:19:56. Razón: Agregar etiquetas [DELPHI] al código
Responder Con Cita
  #2  
Antiguo 09-06-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 09-06-2017
angelratza angelratza is offline
Registrado
NULL
 
Registrado: jun 2017
Posts: 8
Poder: 0
angelratza Va por buen camino
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;

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.

Última edición por Casimiro Notevi fecha: 09-06-2017 a las 23:13:46.
Responder Con Cita
  #4  
Antiguo 09-06-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.037
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Recuerda poner los tags al código fuente, ejemplo:



Gracias
Responder Con Cita
  #5  
Antiguo 09-06-2017
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 913
Poder: 22
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
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 funciona bien...

Saludos cordiales
Responder Con Cita
  #6  
Antiguo 09-06-2017
angelratza angelratza is offline
Registrado
NULL
 
Registrado: jun 2017
Posts: 8
Poder: 0
angelratza Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Recuerda poner los tags al código fuente, ejemplo:

Gracias
Lo estaré haciendo así, gracias por la indicación.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
¿y tú, de qué signo astrológico eres? Casimiro Notevi La Taberna 11 11-04-2009 02:03:54
Comparativa entre Free Pascal 2.2.0 y Turbo Pascal 7.0 esocrates Varios 2 14-07-2008 14:56:24
manual de excepciones de object pascal para free pascal??? Garion OOP 3 27-05-2005 00:42:29
Cambiar Signo en Interbase Pablo_L Firebird e Interbase 2 15-09-2004 14:16:10
Numeros positivos con signo Romanosky Varios 1 11-05-2004 12:20:10


La franja horaria es GMT +2. Ahora son las 13:50:32.


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