DICAS

Visite a biblioteca de dicas da comunidade.

Saiba mais

ARTIGOS

Abordagens detalhadas sobre assuntos diversos.

Saiba mais

INICIANTES

Aprenda a programar de um modo simples e fácil.

Saiba mais

DOWNLOADS

Acesse os materiais exclusivos aos membros.

Saiba mais
voltar

PARA QUEM GOSTA DE DELPHI

Formatação de datas via código e data americana para brasileira

Fala galera do Show Delphi, tudo beleza? Aqui quem fala é o Vitor e trago uma forma de formatação de código sem ferramentas externas

Caso o usuário digite uma data que não esteja no formato “dd/mm/aaaa”, hoje mostrarei como deixar nesse formato

procedure FormatarData(DataDoUsuario : Date);
var
  sData : string;
  iX : integer;
begin
 
  sData := DateToStr(DataDoUsuario);
 
// Isto é opcional, só uma verificação se a data for vazia
  if (trim(sData) = '') or (sData.IsEmpty) then
  begin
    ShowMessage('Data vazia'); // Aqui você pode tratar como quiser a data vazia
    exit; // Eu só vou sair da procedure com o comando "Exit"
  end;
 
{ Caso o usuário Escreva
6/4/23
Iremos formatar para ficar
06/04/23 }
 
// A função "posex" encontra uma string dentro de outra string e returno em qual local da string está através de um index
// Nesse caso, estou a procura da '/' para ver se ele escreveu a data com o dia ou o mês com 1 caractere
// A função 'posex' tem os parametros (subString: string; StringOriginal : string; IndexInicial : integer = 0)
  X := posex('/', sData);
 
{ Esse if verifica se o dia tem um caractere
Por exemplo '6/04/23'
A função 'posex' irá retornar 2 pois a '/' está na segunda posição na string '6/'
Lembrando que a string sempre começa com o index 1, então a barra estaria com o index 2
}
  if X = 2 then
    s := '0' + sData; // Nessa linha Adiciona um 0 no inicio da string, então ficaria assim '06/04/23'
 
{ Este if verifica o mês
Mas dessa vez passaremos o caractere de inicio na posição 4
por exemplo '06/4/23'
A função posex começará a verificar pelo número 4
exemplo 2: '6/4/23'
A função posex começará a verificar encima da segunda '/', e retornará 1
}
  X := posex('/', sData, 4);
 
// Esse if verifica se a data está com 1 caractere no mês '06/4/23'
  if X = 5 then
    Insert('0', sData, 4);
 
// A função Insert, insere uma string dentro de outra de acordo com uma posição
// Nesse exemplo a função irá inserir a string '0' dentro da string sData começando pela posição 4
// que no meu caso fica assim '06/04/23
 
end;

E caso o usuário digite uma data americana onde a formatação é ‘mm/dd/aaaa’
Podemos resolver em poucas linhas de código

var
  sData : string;
begin
 
  sData := DateToStr(DataDoUsuario);
 
// O comando copy usaremos para copiar o dia e o mês da data americana e colocaremos na posição da data brasileira
 
  sData := copy(sData, 4, 2) + '/' + copy(sData, 1, 2) + '/' + copy(sData, 7, 4);
// A nossa data irá ser formatada para 'dd/mm/aaaa'
 
end;

E por último mas não menos importante, caso o nosso usuário digite uma data incompleta, como por exemplo ‘dd/mmaaaa’, ‘ddmm/aaaa’ ou ‘ddmmaaaa’
Sem nenhum separador

var
  sData : string;
begin
 
  sData := DateToStr(DataDoUsuario);
 
// Caso o usuário tenha escrito a data com só uma '/', iremos retirar-lá
  sData := StringReplace(s, '/', '', [rfReplaceAll]);
 
// Após, inserimos as / nos locais corretos da data
  Insert('/', sData, 3);
  Insert('/', sData, 6);
end;

Então pessoal, espero que a dica pode ter ajudado e dúvidas ou sugestões em outras linguagens, deixe o seu comentário.

Uma abraço e até o próximo post. Valeu!

Facebook Comments Box
  • Vitor Hugo Valdemarca
  • 310 views
  • 1 comentários
  • 6 de abril de 2023

Está gostando do conteúdo? Considere pagar um cafezinho para nossa equipe!

Uma resposta para “Formatação de datas via código e data americana para brasileira”

  1. mariodosreis disse:

    Prezados companheiros isto não é errado, mas há formas de formatar a data em todo o programa, aqui está como faço, na MainUnit:

    procedure ConfigurePtRegion;
    var
    PtFormat: TFormatSettings;
    begin
    // Create new setting and configure for the Portuguese format
    PtFormat := TFormatSettings.Create;
    OldFormat:=PtFormat; // antes de alterar;
    try
    PtFormat.DecimalSeparator := ‘,’;
    PtFormat.ThousandSeparator := ‘.’;
    PtFormat.CurrencyDecimals := 2;
    PtFormat.DateSeparator := #45; // Hyphen-minus ‘-‘;
    PtFormat.ShortDateFormat := ‘yyyy-mm-dd’; // ‘dd/mm/yyyy’;
    PtFormat.LongDateFormat := ‘yyyy-mm-dd’; // ‘dd/mm/yyyy’;
    PtFormat.TimeSeparator := #58; // Colon’:’;
    PtFormat.TimeAMString := ‘AM’;
    PtFormat.TimePMString := ‘PM’;
    PtFormat.ShortTimeFormat := ‘hh:nn’;
    PtFormat.LongTimeFormat := ‘hh:nn:ss’;
    PtFormat.CurrencyString := ‘€’;
    PtFormat.NormalizedLocaleName := ‘PT/AZ’;
    // Assign the App region settings to the newly created format

    System.SysUtils.FormatSettings := PtFormat; //System.SysUtils.FormatSettings
    finally
    // System.SysUtils.FormatSettings:=False ; para a eventualidade dos users mecherem na maquuina, garantir que no programa não se alterar
    end;

    end;

    depois:
    initialization

    if not ModuleIsPackage then begin
    // uses HtmlHelpViewer
    Application.HelpFile := ChangeFileExt(Application.ExeName, ‘.chm’);
    // WM_SHELLHOOKMESSAGE := RegisterWindowMessage(‘SHELLHOOK’);
    // HelpWindowManager := THelpWindowManager.Create;
    end;

    If SysLocale.PriLangID=LANG_PORTUGUESE Then
    begin
    ConfigurePtRegion;
    //Prevents format settings being updated automatically when the user alters the system configuration
    Application.UpdateFormatSettings := false; //Application.UpdateFormatSettings := True;

    end;

Deixe um comentário

Ir ao topo

© 2024 Infus Soluções em Tecnologia - Todos os Direitos Reservados