-
Delphi StrToIntDef 函数(字符串转整形,失败时返回默认值)
形式 function StrToIntDef(const S: string; Default: Integer): Integer; 引用单元 SysUtils.pas 功能 返回字符串S转换成整数 说明 字符串非整数表达时则返回默认值Default 参考 procedure System.Val 例子 SpinEdit1.Value := StrToIntDef(Edit1.Text, 0); 返回int(Edit1.Text) 如果不成功,返回0 例子代码: procedure TForm1.btn1Click(Sender: TObject); var i:Integer; S:string; begin edt2.Clear; for i:= 1 to Length(edt1.Text) do begin S:=IntToStr(StrToIntDef(Copy(edt1.Text,i,1), 0)); edt2.Text:= edt2.Text + S ; end; end;
-
如何强制 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;
如何使转换函数忽略十六进制值?
最佳答案
我认为为了安全起见,您应该验证每个字符都是一个数字。
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
, 将零或负数视为字符串。这真的是你的意图吗。