最近有碰到用户提出流水码中不能包含4的需求,原本的想法是正常做十进制的流水码,然后碰到4就跳过,然后重新请求。后面想一想,这么做比较low,而且万一后面用户再提些奇奇怪怪的需求,不要1,不要2啥的,再想了想之前接触过的系统中是支持自定义流水码的,不包含4的这个需求,只需要在自定义中定义流水码为【0,1,2,3,5,6,7,8,9】就可以了,所以开发一个通用的自定义流水码生成功能。
整个思路很简单,就是写一个方法,输入请求的流水,转换成对应自定义的流水码,然后输出。
想法很简单,实现起来用了几个小时,主要是在草稿纸上的花费。
下面先给实现逻辑。
首先我们需要知道,流水码需要生成多少位,因为这个参数会关系到我们返回多少位的流水码,位数不足的话就需要补零(这是最原始的想法,后面再优化之后发现不需要补零)。
然后我们要知道我们需要转换的序号,比如我们要把100转成?,或者把2222转成?,一般我们要流水码都会按序号来,比如100~999,请求900个这种,在我们这种方式下实现,需要先循环起来,把每次的序号传方法进行转换。
最后我们需要知道自定义流水码的内容,即定义了哪些字符作为流水码。
然后是最为精彩的部分,我们实现起来,先从个位开始生成(即右手边第一位)然后逐位生成拼接,注意我们的流水码中是可能有字符的,所以不能用我们以前理解的a*100+b*10+c这种方式,只能用字符串拼接。这里我用一个循环来实现。先上代码吧。
public static string GetCustomSeq(int count,int seq,string[] customSeq) { //这段逻辑太绕了,代码简单,但逻辑特别绕,大致思路为,从右手边第一位开始,逐位计算后拼接到一起 //参考以下公式进行理解 //通用公式 //流水码【流水码序号/自定义流水码的个数^(位数-1)%自定义流水码的个数】 string result =null; //string[] customSeq = ; string gongshi = null; for (int i = 0; i < count; i++) { gongshi = customSeq[seq / Convert.ToInt32( Math.Pow(customSeq.Length, i))% customSeq.Length] + gongshi; } result = gongshi; return result; }
讯享网
核心代码就一行,推导出这个结果却花了几个小时,最后的公式就是这样【流水码序号/自定义流水码的个数^(位数-1)%自定义流水码的个数】,推导的方式就是找规律(请叫我学渣)。这里有个小提示 / 除法操作,当分子分母都为整数时,结果为取整,即30/7=4。推导过程不讲了,也讲不清楚,自己都不知道为啥这么推。下面举个例子讲解。
定义,本次需要输出6位流水码,
流水码区间为80-81(两个就可以看出逻辑,不需要太多)
自定义流水码内容,就按照我们这个需求来,不要4的流水码{0,1,2,3,5,6,7,8,9},按照数组来理解
OK,验证过程,当流水码为80时
第一位 = 流水码[80/9^(1-1)%9] (先算9^(1-1)=1,然后80/1=80,然后80%9=8)=流水码[8]=9
第二位 = 流水码[80/9^(2-1)%9](先算9^(2-1)=9,然后80/9=8,然后8%9=8)=流水码[8]=9
第三位 = 流水码[80/9^(3-1)%9](先算9^(3-1)=81,然后80/81=0,然后0%9=0)=流水码[0]=0
......(和第三位类似,不写了,都是0)
最后结果000099
当流水码为81时
第一位 = 流水码[81/9^(1-1)%9] (先算9^(1-1)=1,然后81/1=81,然后81%9=0)=流水码[0]=0
第二位 = 流水码[81/9^(2-1)%9](先算9^(2-1)=9,然后81/9=9,然后9%9=0)=流水码[0]=0
第三位 = 流水码[81/9^(3-1)%9](先算9^(3-1)=81,然后81/81=1,然后1%9=1)=流水码[1]=1
第四位= 流水码[81/9^(4-1)%9](先算9^(4-1)=81,然后81/729=0,然后0%9=0)=流水码[0]=0
......(和第四位类似,不写了,都是0)
最后结果000100
以上例子已经可以很直观的表明流水码创建的过程,公式和使用场景肯定还有很多可以优化的地方,但对于我的此次需求来说已经足够了,后续有好想法也会持续优化。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/48533.html