ホーム >プログラム >Delphi 6 ローテクTips >エラー無しのStrToInt

数値に変換できる文字列以外をStrToIntに渡すとエラーが起きます。
そのままでは使い勝手が良くないのでエラーを無視する方向で作成。


interface

function gfniStrToInt(sNum: WideString): Int64;


implementation
uses
  SysUtils;


function gfniStrToInt(sNum: WideString): Int64;
//sNumを整数にして返す。
var
  li_Pos, i: Integer;
  ls_Tmp: AnsiString;
begin
  sNum := WideUpperCase(Trim(sNum));
  try
    Result := StrToInt64(sNum);
  except
    ls_Tmp := '';
    for i := 1 to Length(sNum) do begin
      li_Pos := Pos(sNum[i], '$X-+0123456789ABCDEF');
      if (li_Pos >= 15) then begin
        if (ls_Tmp[1] = '$') then begin
          ls_Tmp := ls_Tmp + sNum[i];
        end else begin
          //頭に'$'を付け加えて変換できるようにする
          //頭に$がないと16進表記はエラーになるのでそれへの対処
          ls_Tmp := '$' + ls_Tmp + sNum[i];
        end;
      end else if (li_Pos >= 5) then begin
        ls_Tmp := ls_Tmp + sNum[i];
      end else if ((li_Pos = 1) or (li_Pos = 2)) and (ls_Tmp = '') then begin
        //16進表記
        ls_Tmp := '$';  //'x'や'X'ではだめ
      end else if ((li_Pos = 3) or (li_Pos = 4)) and (ls_Tmp = '') then begin  //and (i = 1) でもよい
        //sNum[i]は'-+'のどれか
        ls_Tmp := sNum[i];
      end else begin
        Break;
      end;
    end;

    if (ls_Tmp = '') then begin
      Result := 0;
    end else begin
      Result := StrToInt64Def(ls_Tmp, 0);
    end;
  end;
end;
  Result := gfniStrToInt('28');         //Result は   0 全角文字列はNG
  Result := gfniStrToInt('28');          //Result は   2
  Result := gfniStrToInt('01-17才.wma');  //Result は   1 計算はしない
  Result := gfniStrToInt('-17才.wma');    //Result は -17
  Result := gfniStrToInt('あいう');       //Result は   0
  Result := gfniStrToInt('$007F');        //Result は 127
  Result := gfniStrToInt('x007f');        //Result は 127 16進は $ と x に対応

Val手続きを使えばもっと簡単に済ますこともできます。