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; |
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; |
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; |
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!
-
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!
Posts Relacionados - Continue Aprendendo
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;