Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   ¿Existe alguna función para saber si una cadena tiene un formato determinado? (https://www.clubdelphi.com/foros/showthread.php?t=69371)

Kandorf 13-08-2010 13:43:24

¿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.

Al González 13-08-2010 18:47:53

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. :)

Kandorf 14-08-2010 12:07:27

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.

Al González 14-08-2010 17:29:09

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. :)

Kandorf 16-08-2010 04:43:55

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.


La franja horaria es GMT +2. Ahora son las 18:49:43.

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