delphi 获取字符串转换为整数时的错误类型(toLarge/NotAString)

vawmfj5a  于 2022-12-18  发布在  其他
关注(0)|答案(1)|浏览(118)

当将用户输入(字符串)转换为整数时出错,我想知道这是因为字符串表示的数字超出了整数限制(例如,大于2147483647),还是因为字符串包含不可转换的字母(如'abc.-')。
我已经尝试捕捉异常并进行调查,但没有任何有意义的信息。

3yhwsihp

3yhwsihp1#

所以这是我现在想出的(我编辑的答案公元前它是有点糟糕之前):

unit BetterStrToInt;

interface

uses
  System.SysUtils, System.SysConst;

type
  EStrToIntOverflowTooBig = class(EConvertError);
  EStrToIntOverflowTooSmall = class(EConvertError);
  EStrToIntBadChar = class(EConvertError);

function BStrToInt(const s: string): integer;

implementation

function BStrToInt(const s: string): integer;
var
  e: integer;
begin
  Val(s, Result, e);
  if e <> 0 then
    if s = '-' then
      raise EStrToIntBadChar.CreateFmt(SInvalidInteger, ['-'])
    else
      if CharInSet(s[e], ['0' .. '9']) then
        if s.StartsWith('-') then
          raise EStrToIntOverflowTooSmall.Create(SIntOverflow)
        else
          raise EStrToIntOverflowTooBig.Create(SIntOverflow)
      else
        raise EStrToIntBadChar.CreateFmt(SInvalidInteger, [s[e]]);
end;

end.

需要if s = '-' then,因为当s = '-'Val()e设置为2时,if CharInSet(s[e], ['0' .. '9']) then中的s[e]将创建索引错误。该行为是不需要的(至少在我看来)。
也许有更好的解决办法,但我不知道任何自动取款机。

相关问题