簡體   English   中英

如何強制StrToInt,StrToIntDef忽略十六進制值?

[英]How to force StrToInt, StrToIntDef to ignore hex values?

我有變量,可以包含字符串或整數。 所以,我使用If StrToIntDef(Value) > 0來決定我處理字符串還是整數。 但是當字符串以'x'或'X'開頭時,這會失敗。 我假設因為它認為它是十六進制數並將其轉換為整數:

procedure TForm1.Button1Click(Sender: TObject);
var
  Value:integer;
  Str:string;
begin

  Str:='string';
  Value:=StrToIntDef(Str,0); // Value = 0  OK

  Str:='xa';
  Value:=StrToIntDef(Str,0); // Value = 10 - NOT OK! Shuold be 0!

  Str:='XDBA';
  Value:=StrToIntDef(Str,0); // Value = 3514 - NOT OK! Shuold be 0!

end;

如何使轉換功能忽略十六進制值?

我認為為了安全起見,你應該驗證每個字符是否為數字。

function StrToIntDefDecimal(const S: string; Default: Integer): Integer;
var
  C: Char;
begin
  for C in S do
    if ((C < '0') or (C > '9')) and (C <> '-') then
    begin
      Result := Default;
      exit;
    end;
  Result := StrToDef(S, Default);
end;

但是,如果您只是想檢測字符串是否為數字,那么您可以這樣做:

function IsDecimalInteger(const S: string): Boolean;
var
  C: Char;
begin
  for C in S do
    if ((C < '0') or (C > '9')) and (C <> '-') then
    begin
      Result := False;
      exit;
    end;
  Result := True;
end;

即便這樣也不完美,因為它會允許像'1-2'這樣的值。 但我相信你可以修改代碼只接受'-'作為第一個字符。

另請注意,您對數字StrToIntDef(Value) > 0的現有測試會將零或負數視為字符串。 這真的是你想要的嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM