您需要将此视为标记化问题,因此 SW1A 1AA 应标记化为:
(尽管如果你愿意,你可以把向内的部分分解成 1 和 AA)
和 G12 8QT 应标记为:
一旦您将邮政编码分解为这些组成部分,那么排序应该很容易。GIR 0AA 邮政编码有一个例外,但您可以硬编码该邮政编码的测试
编辑:关于标记化的更多想法
对于示例邮政编码 SW1A 1AA,SW 是邮政编码区,1A 是邮政编码区(我们将其分成两部分进行排序),1 是邮政编码扇区,AA 是单位邮政编码。
这些是有效的邮政编码格式(来源:Royal Mail PAF 用户指南第 8 页 -本页底部的链接):
AN NAA
AAN NAA
ANN NAA
ANA NAA
AAA NAA(仅适用于 GIR 0AA 代码)
AANN NAA
AANA NAA
所以一个粗略的算法将是(假设我们想要分离部门和单位邮政编码):
- 代码 = GIR 0AA?标记为 GI/R/ /0/AA(将 R 视为区简化事情)
- 代码 5 个字母长,例如 G1 3AF?标记为 G/1/ /3/AF
- 代码 6 个字母长,第 3 个字符是字母,例如 W1P 1HQ?标记为 W/1/P/1/HQ
- 代码 6 个字母长,第二个字符是一个字母,例如 CR2 6XH?标记为 CR/2/ /6/XH
- 代码 7 个字母长,第 4 个字符是一个字母,例如 EC1A 1BB?标记为 EC/1/A/1/BB
- 否则,例如 TW14 2ZZ,标记为 TW/14/ /2/ZZ
如果目的是显示邮政编码列表供用户选择,那么我会采用 Neil Butterworth 的建议,即在数据库中存储邮政编码的“可排序”版本。创建可排序版本的最简单方法是将所有条目填充为九个字符:
- 该区域的两个字符(如果更短,则为右填充)
- 两个代表区号(如果较短,则左填充)
- 一份用于区信(如果丢失,请填写)
- 空间
- 一个用于该部门
- 两个为单位
GIR 0AA 又是一个小例外。如果你用空格填充,那么排序顺序应该是正确的。使用 # 表示空格的示例:
- W1#1AA => W##1##1AA
- WC1#1AA => WC#1##1AA
- W10#1AA => W#10##1AA
- W1W#1AA => W##1W#1AA
- GIR#0AA => GI#R##0AA
- WC10#1AA => WC10##1AA
- WC1W#1AA => WC#1W#1AA
如果区域太短,您需要右填充:左填充会产生错误的排序顺序。所有单字母区域 - B、E、G、L、M、N、S、W - 将在所有双字母区域 - AB、AL、...、ZE 之前排序 - 如果您使用左填充
需要保留区号,以确保自然的 W1、W2、...、W9、W10 顺序保持不变