Как заставить StrToInt, StrToIntDef игнорировать шестнадцатеричные значения?

У меня есть переменная, которая может содержать строку или целое число. Итак, я использую 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 ответ

Решение

Я думаю, чтобы быть в безопасности, вы должны подтвердить, что каждый символ является цифрой.

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, будет обрабатывать ноль или отрицательные числа как строки. Это действительно то, что вы намерены.

Другие вопросы по тегам