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