作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个可以保存字符串或整数的变量。因此,我使用 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
会将零或负数视为字符串。这真的是你想要的吗?
关于delphi - 如何强制 StrToInt、StrToIntDef 忽略十六进制值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43141090/
我有一个可以保存字符串或整数的变量。因此,我使用 If StrToIntDef(Value) > 0 来决定是处理字符串还是整数。但是,当字符串以“x”或“X”开头时,此操作会失败。我假设是因为它认为
我是一名优秀的程序员,十分优秀!