Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-08-2010
Kandorf Kandorf is offline
Miembro
 
Registrado: may 2007
Posts: 38
Poder: 0
Kandorf Va por buen camino
¿Existe alguna función para saber si una cadena tiene un formato determinado?

Siento preguntar por una función, pero he estado buscando de todas las maneras que sé y no he encontrado nada.

Antes de nada quiero aclarar que no estoy pidiendo que me hagan una función, es para saber si existe o si alguien la ha implementado por algún lado, y si no, para implementarla yo, con lo que se aceptarían consejos.

Busco algo así como una función a la que se le pasen dos strings: uno para la cadena en la que comprobar y otra en la que se indicaría el formato; y que devuelva un booleano.

La función sería algo así:
Código Delphi [-]
function ComprobarFormato(Cadena, Formato: String): Boolean;
Ejemplos de su utilización sería:
ComprobarFormato(1/4/2010,*/*/*);
ComprobarFormato(2 de junio de 2009,*de*de*);
ComprobarFormato(12345678-A,*-#);
O algo parecido, no he estudiado demasiado cómo especificar el formato, sólo he pensado en usar * para N caracteres y # para uno solo, estaría bien poder especificar si son letras o números.

Saludos y gracias por vuestro tiempo.
Responder Con Cita
  #2  
Antiguo 13-08-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Hola Kandorf.

Lo que planteas se conoce como búsqueda de expresiones regulares (http://es.wikipedia.org/wiki/Expresiones_regulares), y es seguro que encontrarás más información sobre este tema en el foro. En la Red existen varias funciones y componentes para tal labor, y ahora mismo no recuerdo si las últimas versiones de Delphi incluyen algo así de fábrica, pero es posible.

Saludos.

Al González.
Responder Con Cita
  #3  
Antiguo 14-08-2010
Kandorf Kandorf is offline
Miembro
 
Registrado: may 2007
Posts: 38
Poder: 0
Kandorf Va por buen camino
Hola, gracias por responder. No he comprobado si delphi tiene funciones que lo hagan, pero he encontrado algo por internet.
Por si a alguien le resulta útil, he estado buscando por google y he encontrado unas librerías llamadas TRegExpr, aquí hablan un poco de ellas http://www.latiumsoftware.com/es/articles/00009.php , hay documentación en español, pero la página oficial ya no existe, se pueden descargar de aquí http://www.slunecnice.cz/sw/tregexpr/

Saludos.
Responder Con Cita
  #4  
Antiguo 14-08-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Gracias por los nuevos enlaces. Que bueno que encontraste esa biblioteca. Si buscas en estos mismos foros, verás que hay varios hilos donde se comenta sobre ella.

No dejes de preguntarnos si surge alguna duda, y de compartir algo de cómo lo solucionaste si lo crees justo.

Saludos.
Responder Con Cita
  #5  
Antiguo 16-08-2010
Kandorf Kandorf is offline
Miembro
 
Registrado: may 2007
Posts: 38
Poder: 0
Kandorf Va por buen camino
Hola, la duda me surgió porque quise poder pasar fechas escritas a mano a TDate, tales como "1/4/2010", "1-4-99" o "2 de junio de 2009", para ello he utilizado estas librerías y he creado la siguiente función, se podrá mejorar seguro, pero a mí por ahora me satisface.

Código Delphi [-]
// Pasa una fecha escrita a mano a TDate
function FechaAMano(Fecha: String): TDate;
var
  Expresión: TRegExpr;
  Pos: Integer;
  NuevaFecha: String;
begin
  Expresión:=TRegExpr.Create;

  Expresión.Expression:='\d\d*.*(ENERO|FEBRERO|MARZO|ABRIL|MAYO|JUNIO|JULIO|AGOSTO|SEP?TIEMBRE|OBTUBRE  |NOVIEMBRE|DICIEMBRE).*\d{2}';
  Fecha:=UpperCase(Fecha);
  Fecha:=ReplaceStr(Fecha,'SETIEMBRE','SEPTIEMBRE');
  if Expresión.Exec(Fecha) then begin
    Expresión.Expression:='\d\d*';
    Expresión.Exec(Fecha);
    NuevaFecha:=Copy(Fecha,Expresión.MatchPos[0],Expresión.MatchLen[0])+'/';

    Expresión.Expression:='(ENERO|FEBRERO|MARZO|ABRIL|MAYO|JUNIO|JULIO|AGOSTO|SEP?TIEMBRE|OBTUBRE|NOVIEM  BRE|DICIEMBRE)';
    Expresión.Exec(Fecha);
    NuevaFecha := NuevaFecha+IntToStr(StringToCaseSelect(Copy(Fecha,Expresión.MatchPos[0],Expresión.MatchLen[0]),['ENERO','FEBRERO','MARZO','ABRIL','MAYO','JUNIO','JULIO','AGOSTO','SEPTIEMBRE','OBTUBRE','NOVIEMBRE'  ,'DICIEMBRE'])+1)+'/';

    Fecha:=Copy(Fecha,Expresión.MatchPos[0]+Expresión.MatchLen[0],Length(Fecha));
    Expresión.Expression:='\d\d*'; // Si aquí pongo sólo '\d*' no funciona, así que lo pongo así...
    Expresión.Exec(Fecha);
    NuevaFecha:=NuevaFecha+Copy(Fecha,Expresión.MatchPos[0],Expresión.MatchLen[0]);

    Result:=StrToDate(NuevaFecha);
  end else begin
    Expresión.Expression:='(\d{1}|\d{2})(-|/)(\d{1}|\d{2})(-|/)\d{2}';
    if Expresión.Exec(Fecha) then begin
      Fecha:=ReplaceStr(Fecha,'-','/');

      Result:=StrToDate(Fecha);
    end else
      Result:=0;
  end;

  Expresión.Free;
end;

// Dejo también el código de StringToCaseSelect, ya que la utiliza
// Permite usar Strings con una sentencia CASE
function StringToCaseSelect(Selector: String; Opciones: array of String): Integer;
var
    i: Integer;
begin
    Result:=-1;
    for i:=0 to Length(Opciones)-1 do
    begin
        if CompareText(Selector,Opciones[i]) = 0 then
        begin
            Result:=i;
            break;
        end;
    end;
end;
Saludos, espero que resulte últil a alguien.
Responder Con Cita
Respuesta



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
¿existe alguna funcion que actue como un timer sin usar el propio componente? cocute Varios 6 13-01-2010 09:54:34
¿Existe función para asignar a una cadena el resultado de concatenarla con otra? noob Varios 8 13-02-2009 19:34:53
Existe alguna función en Firebird que me permita restar fechas??? Nelly Varios 1 06-07-2007 21:27:56
Funcion para borrar la cadena que aparesca repetida dentro de otra cadena flystar Varios 1 02-07-2007 23:51:10
Funcion para buscar cadena dentro de otra cadena y el numero de veces flystar Varios 3 02-07-2007 22:48:08


La franja horaria es GMT +2. Ahora son las 01:55:23.


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