综述:
对于操作系统中的行为:
对于Delphi中的编程,使用StrCmpLogicalW Windows API进行自然排序。
==========================
以下文件名将在Windows资源管理器中订购,如下所示:
test_1_test.txt
test_2_test.txt
test_11_test.txt
test_12_test.txt
test_21_test.txt
test_22_test.txt
例如,如果我将它们放在TStringList实例中并调用Sort,则排序顺序如下:
test_1_test.txt
test_11_test.txt
test_12_test.txt
test_2_test.txt
test_21_test.txt
test_22_test.txt
为了记录,上述文件名将在Cygwin的rxvt终端或CentOS等Linux发行版的xterm终端中订购,如下所示:
test_11_test.txt
test_12_test.txt
test_1_test.txt
test_21_test.txt
test_22_test.txt
test_2_test.txt
您能否帮助评论如何理解排序行为的这种差异?此外,是否可以获得与Windows资源管理器中相同的顺序?任何建议表示赞赏!
PS:我的Windows语言环境设置为中文,但我认为英语语言环境也是如此。
答案 0 :(得分:21)
StrCmpLogicalW能够处理数字,另一种选择是CompareString
答案 1 :(得分:16)
感谢Anders - 答案是StrCmpLogicalW;我没有在Delphi 2009中找到它的声明,所以我在下面的测试中自己声明:
type
TMyStringList = class(TStringList)
protected
function CompareStrings(const S1, S2: string): Integer; override;
end;
function StrCmpLogicalW(P1, P2: PWideChar): Integer; stdcall; external 'Shlwapi.dll';
function TMyStringList.CompareStrings(const S1, S2: string): Integer;
begin
Result:= StrCmpLogicalW(PChar(S1), PChar(S2));
end;
procedure TForm11.Button2Click(Sender: TObject);
var
SL: TMyStringList;
begin
SL:= TMyStringList.Create;
try
SL.Add('test_1_test.txt');
SL.Add('test_11_test.txt');
SL.Add('test_12_test.txt');
SL.Add('test_2_test.txt');
SL.Add('test_21_test.txt');
SL.Add('test_22_test.txt');
SL.Sort;
Memo1.Lines:= SL;
finally
SL.Free;
end;
end;