【发布时间】:2019-09-19 01:29:00
【问题描述】:
在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'] ...
或者我错过了什么?
【问题讨论】:
-
@NasreddineGalfout 没有 IntPart 是一个字符串,无论如何为什么要在 ['1','3','5','7','9'] 中比较 #0 ....跨度>
-
是的,
String.Chars[]在从零开始的字符串上运行。见SysUtils.TStringHelper.Chars。有问题的代码应该使用Length(intPart)-1来获取字符串中的最后一个字符。设置范围检查,但不会引发异常。 -
所以你发现了两个bug,
SysUtils.InternalTextToCurrency中最后一个字符的无效检查,TStringHelper.Chars中的缺失范围检查。 -
文档也是错误的。同样:没有从零开始的字符串,只是它们的索引方式不同。 same 字符串可以从零开始或从一开始索引,具体取决于设置。 TStringHelper 不是为了对从零开始的字符串进行操作而编写的。它使用从零开始的索引。 TStringHelper 可以对任何 UnicodeString 进行操作,无论使用哪种设置,并且始终为字符串呈现一个从零开始的接口。
-
除了在这里讨论有多少天使可以在一个针点上跳舞之外:有人会就此提交错误报告吗?