请问 设计身份证数据结构 这到底是要做什么?

解决方案 »

  1.   

    身份证号码以前是15位,现在是18位。先说15位,原来是⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂,其中⑴⑵两位表示省级编号,⑶⑷两位表示市级编号,⑸⑹表示县级编号;⑺-⑿表示出生年月日,其中年用两位表示;最后三位表示同一个地区同年同月同日出生的人的编号(不知道是不是按顺序编号),奇数表示男,偶数表示女(BTW,过去的身份证号通过最后一位数字就可以看出性别)。再说18位,⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅,⑴-⑹的含义跟15位的一样,而⑺-⒁表示出生年月日,其中年用四位表示;最后四位表示同一个地区同年同月同日出生的人的编号,但这个编号具体不清楚用什么方式,不过似乎最后一位是校验位,因为现在网上有一些测试身份证号真伪的软件,如果最后一位输入错误的话会有提法,当然,这跟题目并不相干。如果仅仅是直接用一个字符串存储身份证号码当然可以,但是这样不够理想,比如,至少得保证出生年月日在合理的范围之内吧?总不能是3456年78月90日吧?所以按照上面说的身份证号的组成规律分成多个字符串来表示,每个字符串表示一部分,比如用year表示出生年份,用provinceId表示所在省的编号等等,这样还可以验证每个字符串的合理性。
      

  2.   

    设计数据结构的目的是简单明了的解决问题,用一个字符串就可以解决的问题,为什么还要将数据拆解的支离破碎?brooksychen意见明显违背数据完整性约束,身份证的格式早已明确,可以用正则表达式进行效验!
      

  3.   

    aotianji1238(塔罗大道)说的有一定道理,我并不是反对用一个String存储身份证号,相反,这是最简单最直观的方式。正则表达式可以解决年月日的问题,但是对于省市编号的完整性检查就麻烦一些。比如,3、4位显然要根据1、2位的值来确定,对于某些省,3、4位填15是有效的,但对于其他省可能就无效,这种完整性检查如果作为一个字符串当然来做当然也可以,只是感觉稍有点麻烦,因为每次验证都要取子字符串。当然,如果存成多个字符串的话,对于Java而言,一个身份证号会生成多个字符串对象,有点浪费内存,这是缺点。再看看lz的题目,我可能理解错了,lz说的好像是身份证的设计而不是身份证号码的设计……