2012年9月28日金曜日

TryStrToDateTimeEx 修正


昨日のエントリ「TryStrToDateTime を完璧にする」ですが、全然完璧じゃありませんでした!/(^o^)\

2重ループを抜けていない、という問題がありました。
ということで、修正した物が↓こちらです。

function TryStrToDateTimeEx(
  const iStr: String;
  out oDateTime: TDateTime): Boolean;
label
  Last;
const
  DateSeps: array [0.. 1] of Char = ('/', '-');
  TimeSeps: array [0.. 1] of Char = (':', '.');
var
  FS: TFormatSettings;
  i, j: Integer;
begin
  FS := TFormatSettings.Create;

  for i := Low(DateSeps) to High(DateSeps) do begin
    FS.DateSeparator := DateSeps[i];

    for j := Low(TimeSeps) to High(TimeSeps) do begin
      FS.TimeSeparator := TimeSeps[j];

      Result := TryStrToDateTime(iStr, oDateTime, FS);
      if (Result) then
        goto Last;
    end;
  end;

Last:
end;

Delphi 言語には多重ループを一発で抜けるスマートな方法は用意されていません。
そのため、ここでは goto を使って抜けてみました。
本物のプログラマは goto を恐れずに使うからです!(まあ本物のプログラマは Pascal を使わずに  FORTRAN  を使うわけですがね……)

もしもここで、

for i = 0 to 99 do begin
  for j = 0 to 99 do begin
    Result := true;

    if (Result)
      Break;
  end;

  if (Result)
    Break;
end;

なんて書いた方が冗長だと判って貰えると思います。

Exit が引数を取れるようになったように、Break も一発で抜けれる機構を採り入れてくれたら、良いかも知れないですね。

0 件のコメント:

コメントを投稿