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.
1条答案
按热度按时间3yhwsihp1#
所以这是我现在想出的(我编辑的答案公元前它是有点糟糕之前):
需要
if s = '-' then
,因为当s = '-'
Val()
将e
设置为2
时,if CharInSet(s[e], ['0' .. '9']) then
中的s[e]
将创建索引错误。该行为是不需要的(至少在我看来)。也许有更好的解决办法,但我不知道任何自动取款机。