数値に変換できる文字列以外を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手続きを使えばもっと簡単に済ますこともできます。