Ответ 1
StrCmpLogicalW способен обрабатывать числа, другая альтернатива CompareString
Суммирование:
Поведение в операционных системах:
Для программирования в 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
И для записи указанные имена файлов будут упорядочены в терминале rxvt терминалов Cygwin или xterm дистрибутивов Linux, таких как CentOS, как показано ниже:
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 установлен китайский язык, но я бы подумал, что это касается английского языка.
StrCmpLogicalW способен обрабатывать числа, другая альтернатива CompareString
Спасибо 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;