QString 新提供了一个 NaturalCompareW 函数(兼容Delphi/C++ Builder 2007+)为大家提供按自然语言规则进行比较大小,也就是所谓的自然排序。所谓的自然排序是指像字母后面跟数字的情况下,不是按照字符本身的顺序,而是按照数字的值的顺序进行排序。如:A2 A10 A1 这三个字符串,按一般的计算机内部排序算法是 A1 A10 A2,而按自然排序的话,顺序应为:A1 A2 A10。
我们先看一下这个函数的声明:
/// <summary>使用自然语言规则比较字符串</summary> /// <param name="s1">第一个要比较的字符串</param> /// <param name="s2">第二个要比较的字符串</param /// <param name="AIgnoreCase">比较时是否忽略大小写</param> /// <remarks>本比较考虑中文全角的情况,认为中文全角符号和对应的半角符号是相等的值</remarks> function NaturalCompareW(s1, s2: PQCharW; AIgnoreCase: Boolean): Integer;
参数说明在上面的声明中已经描述的比较清楚了,我们在其中处理了全角字符的情况,在中文自然排序规则中,我们认为全角和半角对应的同一个字符。
下面是一段示例代码,对 Memo1 中用户输入 的内容进行自然语言排序,然后输出到 Memo2 中。
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Memo2: TMemo; CheckBox1: TCheckBox; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses QString; {$R *.dfm} function NCmp(List: TStringList; Index1, Index2: Integer): Integer; begin Result := NaturalCompareW(PQCharW(List[Index1]), PQCharW(List[Index2]), false); end; function NCmpI(List: TStringList; Index1, Index2: Integer): Integer; begin Result := NaturalCompareW(PQCharW(List[Index1]), PQCharW(List[Index2]), true); end; procedure TForm1.Button1Click(Sender: TObject); var AList: TStringList; begin AList := TStringList.Create; AList.AddStrings(Memo1.Lines); if CheckBox1.Checked then AList.CustomSort(NCmpI) else AList.CustomSort(NCmp); Memo2.Lines.Assign(AList); FreeObject(AList); end; end.
实际运行效果如下图所示:
1、区分大小写:
2、忽略大小写
本演示程序下载: