如何强制StrToInt,StrToIntDef忽略十六进制值?

时间:2017-03-31 12:47:58

标签: delphi delphi-10-seattle string-conversion

我有一个可以包含字符串或整数的变量。所以,我使用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;

如何使转换功能忽略十六进制值?

1 个答案:

答案 0 :(得分:3)

我认为为了安全起见,您应该验证每个字符是否为数字。

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的现有测试会将零或负数视为字符串。这真的是你想要的吗。