[英]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.