Question

I'm trying to validate dates entered by the user using TryStrToDate to ensure that they can be properly displayed on the screen of the application I'm working on, but don't know exactly how it all works. I want to be able to return False when a valid date that isn't exactly 10 characters in length is entered.

For example, 09/02/2012 would return True, but 09/2/2012 or 9/02/2012 would return False.

I wanted to keep this simple so I've only been interested in using TryStrToDate, but if there is another built in function that does this then that would be just as good. The data entered by the user is validated on entry to only allow a 10 character date.

Because of this I am currently using something like:

var
  tempStr: string;
  tempDate: TDateTime;
  fs: TFormatSettings;
  error: Boolean;
  count: Integer;
begin
  tempStr := '09/2/2012'; //example of a date that should be rejected.
  GetLocaleFormatSettings(2048, fs);
  error := not TryStrToDate(tempStr, tempDate, formatSettings);
  if not error then
  begin
    error := True;
    if Length(tempStr) = 10 then
    begin
      count := Length(tempStr) - Length(StringReplace(tempStr, '/', '',   [frReplaceAll]));
      error := not (count = 2);
    end
  end
end

Which works just fine, but there is also an instance of data being imported from a .csv file through XML which could have any sort of format to it.

My current solution still seems to work, but I was wondering if there was a way to minimize the processing by just using TryStrToDate and having it only accept valid dates in the 10 character format that I require. I've tried manually setting the shortdate format:

fs.ShortDateFormat := 'mm/dd/yyyy';

but TryStrToDate always accepts valid dates, even if they aren't exactly 10 characters in length.

My Ideal solution would be to keep it to something like:

error := not TryStrToDate(tempStr, tempDate, fs);

Just wondering if that is possible using TryStrToDate or some other delphi function.

Any help is greatly appreciated!

I'm using Delphi 7 by the way.

Était-ce utile?

La solution

Create this function:

function IsValidDateCheck(const AValue: String): Boolean;
var
  dtTemp: TDateTime;
begin
  Result := False;

  if Length(AValue) = 10 then
    if (AValue[3] = '/') and (AValue[6] = '/') then
      Result := TryStrToDate(AValue, dtTemp);
end;

Example usage:

if IsValidDateCheck(tempStr) then
  ShowMessage(tempStr + ' is a valid date.')
else
  ShowMessage(tempStr + ' is not a valid date.');

Autres conseils

Regarding your second problem:

If you don't know which date format the input file uses, this will will cause you a lot of pain. There are many date formats some of them contradicting each other, e.g.:

American: MM/DD/YY British: DD/MM/YY

Of course you could try to guess the format or try to use the Windows settings, but both will fail under some circumstances. Either let the user configure the format, force the file structure to declare the format or support only one format (preferably some international standard e.g. ISO 8601 YYYY-MM-DD).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top