8

system.sysutils.pas,在里约,他们添加了这条指令:

var intPart: String;

... IntPart.Chars[length(IntPart)] in ['1','3','5','7','9'] ...

但据我所知,s.Chars[xx]将始终是从零开始的字符串,所以这样做IntPart.Chars[length(IntPart)] in ['1','3','5','7','9']总是会超出边界吗?

不能改为写

... IntPart.Chars[length(IntPart)-1] in ['1','3','5','7','9'] ...

或者我想念什么?

4

1 回答 1

10

但据我所知, s.Chars[xx] 将始终是从零开始的字符串

TStringHelper的,无论编译器设置如何({$ZEROBASEDSTRINGS ON/OFF}),例程都被编写为从零开始对字符串进行操作。请参阅SysUtils.TStringHelper.Chars

所以在 ['1','3','5','7','9'] 中做 IntPart.Chars[length(IntPart)] 总是会超出边界吗?

那是对的。它应该是Length(IntPart)-1

报告为: SysUtils.InternalTextToCurrency 访问字符串越界

更新:在 Delphi 10.3.3 Rio 中修复。


此外,当范围检查打开时,IntPart.Chars[length(IntPart)]应该引发异常。这也是错误(在 中TStringHelpers.Chars)。

报告为: TStringHelper.Chars 索引越界时不发出范围错误

于 2019-04-30T14:28:28.003 回答