今天在CSDN上逛的时候,我突然看到一个提问帖子:
问一个大家一个问题
一个字符串 加1 谁做过
例如KA001A001
下一个就是 KA001A002
到 KA001Z999
就 KA002A001
这顿时引起了我的兴趣。流水号(Serial Number)在程序中应用很普遍,生成规则也各不相同。(比如,我们公司的会员卡卡号规则里面就有一个“卡号遇4跳过”的选项。)我上Google简单搜了一下,发现都是硬编码的函数,虽然它们能解决具体的问题,但不够通用灵活,换个应用场景又需要重写代码。那有没有一种简单、通用又灵活的流水号生成器呢?今天就让我们一起来试试。
流水号一般都是固定长度,由几部分组合而成:
- 日期(如:20090101)
- 常量代码(如:KA)
- 数字序列(如:0001-9999)
- 字母序列(如:A-Z)
- 特殊字符(如:-)
简单分析之后,我们先定义一个接口(Delphi):
- 生成下一个可用的流水号(NextSerialNumber)
- 验证某个流水号是否合法(Validate)
OK,接下来我们先列个简单的任务列表:
任务列表
- 支持可循环的数字序列('001’-'999’)
- 支持可循环的字母序列('A’-'Z’)
- 支持常量代码('KA’)
- 支持字母序列和数字序列组合(KA001A001)
再写一个简单的测试用例(Test Case):
-
支持可循环的数字序列('001’-'999’) - 支持可循环的字母序列('A’-'Z’)
- 支持常量代码('KA’)
- 支持字母序列和数字序列组合(KA001A001)
接下来我们分别实现字母序列和常量代码流水号:
-
支持可循环的数字序列('001’-'999’) -
支持可循环的字母序列('A’-'Z’) - 支持常量代码('KA’)
- 支持字母序列和数字序列组合(KA001A001)
-
支持可循环的数字序列('001’-'999’) -
支持可循环的字母序列('A’-'Z’) - 支持常量代码('KA’)
- 支持字母序列和数字序列组合(KA001A001)
呵呵,到了高潮部分了,我们先写一段测试案例来测试组合流水号: