ZWAME

Voltar   ZWAME > Criatividade e Desenvolvimento > Programação

Avisos

Responder
 
Opções Mostrar Modos
Antigo 29-01-2009, 23:30   #1
alfinete
Power Member
 
Avatar de alfinete
 
Data do Registo: 30-11-2005


Solução Validação de datas em c# [Expressão regular]

Como validar uma data c#
Código:
#region [valida datas]

                    /*************Datas**********/
                    /*validacao de comparação entre duas datas ,
                     * datai - datainicial, 
                     * dataf - datafinal, 
                     * label - label erro da data final*/
                    public bool comparadatas(DateTime datai, DateTime dataf, System.Web.UI.WebControls.Label label)
                    {
                      bool res = false;
                      if (dataf >= datai)
                      {
                        res = true;
                        label.Text = "<span class=\"erroverdade\">*</span> ";
                      }
                      else
                      {
                        res = false;
                        label.Text = "<span class=\"errofalso\">*</span> ";
                      }
                      return res;
                    } 

                    /*Validação geral d um campo data  */
                    /* data - string da data inserida na textbox
                     * dataminima - string da data minima que pode ser inserida
                     * label - id da labelde erro referente a um determinado campo */
                    public bool VDatas(string data, string dataminima, System.Web.UI.WebControls.Label label)
                    {

                      bool resul = false;

                      // testa para caixa de data decisão vazia
                      if (data == "")
                      {
                        label.Text = "<span class=\"errofalso\">*</span> ";

                        resul = false;
                      }
                      // valida campo diferente de vazio
                      if (data != "")
                      {
                        //valida para campo com 10 caracteres e campo com tim e 10 caracteres
                        if ((data.Length == 10) || (data.Length == 10))// testa p numero de caracteres
                        {
                          // testa se e data valida
                          if (validaData(data))
                          {
                            string datamin = dataminima;
                            string strdatamin = datamin.Substring(6, 4) + "-" + datamin.Substring(3, 2) + "-" + datamin.Substring(0, 2);
                            DateTime datageral2 = Convert.ToDateTime(strdatamin);

                            string str = data.Substring(6, 4) + "-" + data.Substring(3, 2) + "-" + data.Substring(0, 2);
                            DateTime datageral = Convert.ToDateTime(str);

                            //testa se é menor ou igual que  a data actual
                            if (datageral <= datageral2)
                            {
                              label.Text = "<span class=\"errofalso\">*</span>";
                              resul = false;
                            }
                            //testa se é maior que a data actual
                            if (datageral > datageral2)
                            {
                              label.Text = "<span class=\"erroverdade\">*</span>";
                              resul = true;
                            }

                          }
                          else
                          {
                            label.Text = "<span class=\"errofalso\">*</span>";

                            resul = false;
                          }
                        }
                        else
                        {
                          label.Text = "<span class=\"errofalso\">*</span>";

                          resul = false;

                        }

                      }
                      return resul;
                    }

                    //valida data no ambito da sua formatação
                    private bool validaData(string str)
                    {

                      Regex Data = new Regex(@"^((((0?[1-9]|[12]\d|3[01])[\-](0?[13578]|1[02])[\-]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|[12]\d|30)[\-](0?[13456789]|1[012])[\-]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|1\d|2[0-8])[\-]0?2[\-]((1[6-9]|[2-9]\d)?\d{2}))|(29[\-]0?2[\-]((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00)))|(((0[1-9]|[12]\d|3[01])(0[13578]|1[02])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|[12]\d|30)(0[13456789]|1[012])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|1\d|2[0-8])02((1[6-9]|[2-9]\d)?\d{2}))|(2902((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00))))$");
                      return Data.IsMatch(str);

                    }




            #endregion
conjunto de metodos em c# desenvolvidos por mim , excepto a exp regular

validaData() , verifica tb se ano é bisexto ou n , recebe uma string data e verifica se a mesma é valida em ralaç
ão a uma especificação, penso que esta formatada para dd-mm-aaaa, sempre a podes alterar
devolvendo true caso seja valida e false caso contrario


comparadatas(), compara se uma data é maior que outra devolvendo true caso verdade e false caso falso ....


VDatas() tb devolve true ou false caso seja verdadeiro ou falso.

esta faz tdas as verificações possiveis (pode faltar uma ou outra mas são suficientes),
  • se o campo de data vazio ou não ,
  • verifica o tamanho da string da data,
  • se data valida "validaData()",
  • verifica se a data a tua data em relação a actual.
se não me engano esta espressão regular da ate ano 2040 e tal (salvo erro)

Última edição de Armadillo : 30-01-2009 às 10:12 Razão: adicionada tag [code]
alfinete está offline   Responder com citação
Antigo 30-01-2009, 10:28   #2
_freelancer_
Power Member
 
Avatar de _freelancer_
 
Data do Registo: 05-02-2004
Local: Leicester, UK

My System

Código:
public bool validaData(string sData) {
     try {
         DateTime.Parse(sData);
         return true;
     } catch {
         return false;
     }
}
Mais simples e sem usar regex.
__________________
Avaliação
_freelancer_ está offline   Responder com citação
Antigo 01-02-2009, 01:50   #3
alfinete
Power Member
 
Avatar de alfinete
 
Data do Registo: 30-11-2005


sim mas supoe que ao pores uma ata na txtbox queres validar se essa mesma data esta no formato

dd-mm-aaa ou dd/mm/aaa ou dd.nn.aaa , e por ai fora a expressão regular serve para isso mesmo
alfinete está offline   Responder com citação
Antigo 01-02-2009, 02:07   #4
MeY-ZiNG
Power Member
 
Data do Registo: 01-12-2002
Local: Oeiras

My System

Citação:
Resposta Original de alfinete Ver Resposta
sim mas supoe que ao pores uma ata na txtbox queres validar se essa mesma data esta no formato

dd-mm-aaa ou dd/mm/aaa ou dd.nn.aaa , e por ai fora a expressão regular serve para isso mesmo
Para isso tens o DateTime.ParseExact (ou TryParseExact) que recebe num dos argumentos uma string a indicar o formato em que se encontra a data... se aceitas vários formatos distintos, podes ter uma lista de strings com formatos e iteras sobre essa lista, chamando o método TryParseExact em cada iteração...

... ou então usas uma expressão regular que suporte os casos todos, mas aí podem escapar-te alguns casos...
__________________
A minha thread de avaliação: http://www.techzonept.com/showthread.php?p=484844

[Uma curva belíssima, uma equipa fantástica... és a nossa fé!!!!!! FORÇA SPORTING allez!!]
MeY-ZiNG está offline   Responder com citação
Antigo 01-02-2009, 15:37   #5
Feiticeiro
Power Member
 
Avatar de Feiticeiro
 
Data do Registo: 06-05-2002
Local: http://localhost


Separas o ano, mês e dia. Colocas num try catch e convertes para a data no formato que pretendes. Devolve true se correcta, false se não.
Feiticeiro está offline   Responder com citação
Antigo 01-02-2009, 20:44   #6
alfinete
Power Member
 
Avatar de alfinete
 
Data do Registo: 30-11-2005


mas nesse caso ficas com mais code


ai so tens uma linha com a expressão regular se da true é verdadeira se e false da falsa

as restantes verificações so tem a ver com datas minimas e maximas, tamanho da data etc

por isso a da expressão regular fica com menos code

mas ambas as abordagens estão bem
alfinete está offline   Responder com citação
Responder

Marcadores

Voltar   ZWAME > Criatividade e Desenvolvimento > Programação



« Anterior | Seguinte »
Opções
Mostrar Modos

Regras
Não pode abrir novos tópicos
Não pode colocar mensagens
Não pode colocar anexos
Não pode editar as suas mensagens

BB code está Ligado
Smilies estão Ligado
[IMG] code está Ligado
HTML Code está Desligado

Saltar Fórum

Registe-se no fórum e active o seu registo para deixar de ver este anúncio.


Hora GMT +1. São agora 13:10.


Powered by: vBulletin Version 3.8.4
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
© Zwame, Lda 2008-2010. Reprodução proibida sem autorização prévia.