版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 目錄</b></p><p> 1 緒論··························
2、3;·································1</p><p&g
3、t; 課題內(nèi)容與要求···································
4、;···········1</p><p> 需求分析·····················
5、;·······························1</p><p> 1.3操作環(huán)境
6、183;····································
7、················1</p><p> 2 功能實(shí)現(xiàn)設(shè)計(jì)···············&
8、#183;····································
9、;2</p><p> 2.1總體設(shè)計(jì)·······························
10、183;·····················2</p><p> 2.1.1程序設(shè)計(jì)組成框圖·········
11、;·······························2</p><p> 2.1.2數(shù)據(jù)流圖
12、····································
13、3;···········2</p><p> 2.2詳細(xì)設(shè)計(jì)····················&
14、#183;································3</p><p>
15、 2.2.1存放信息設(shè)計(jì)··································
16、3;········4</p><p> 2.2.2構(gòu)造函數(shù)設(shè)計(jì)······················
17、83;····················4</p><p> 2.2.3判斷信息是否正確··········
18、·····························9</p><p> 2.2.4新舊身份證號轉(zhuǎn)換·
19、83;····································1
20、3</p><p> 2.2.5窗口類的創(chuàng)建及實(shí)現(xiàn)······························
21、183;·····13</p><p> 3 運(yùn)行結(jié)果·························
22、3;······························14</p><p> 4 總結(jié)·
23、183;····································
24、······················16 參考文獻(xiàn)·············
25、183;····································
26、·········17</p><p> 附錄·······················&
27、#183;····································
28、;···18</p><p><b> 1 緒論</b></p><p> 1.1 課題內(nèi)容與要求</p><p><b> 課題內(nèi)容</b></p><p> 身份證第18位(校驗(yàn)碼)的計(jì)算方法:</p><p> ?。?)將前面的身
29、份證號碼17位分別乘以不同的系數(shù):</p><p> 從第一位到第十七位的系數(shù)分別為:</p><p> 7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2;</p><p> ?。?)將這17位數(shù)字和系數(shù)相乘的結(jié)果相加;</p><p> ?。?)用加出來和除以11,得余數(shù);</p><p>
30、 ?。?)余數(shù)0-1-2-3-4-5-6-7-8-9-10</p><p> 對應(yīng)的最后一位身份證號碼為1-0-X-9-8-7-6-5-4-3-2;</p><p> 身份證號碼的第七位到十四位為出生年月日,應(yīng)符合現(xiàn)實(shí);</p><p><b> 課題要求</b></p><p> (1)使用java語言完成本課
31、題的程序設(shè)計(jì),并具有一定的深度和難度;</p><p> (2)結(jié)構(gòu)化程序設(shè)計(jì),源程序要有適當(dāng)?shù)淖⑨專钩绦蛉菀组喿x;</p><p> (3)能先對問題進(jìn)行分析然后進(jìn)行設(shè)計(jì)最后進(jìn)行編碼的原則。每一步都要有文檔產(chǎn)生;</p><p> (4)程序一定要做必要的測試和分析,必須得到合理結(jié)果;</p><p> ?。?)可適當(dāng)添加功能,讓程
32、序更具有實(shí)用性。</p><p> ?。?)提交的所有材料必須符合《長沙理工大學(xué)課程設(shè)計(jì)管理規(guī)定》(長理工大[2005]8號)的要求。</p><p><b> 1.2 需求分析</b></p><p> 本課題主要目的是為了設(shè)計(jì)一套程序來驗(yàn)證給出的身份證號是否正確,如若正確將身份證號所體現(xiàn)的關(guān)鍵信息性別,年齡,出生日期展現(xiàn)給用戶,同時考
33、慮到實(shí)實(shí)際情況給出了十五位身份證號轉(zhuǎn)十八位,以及十八位轉(zhuǎn)十五位的算法, 從而給相關(guān)部門機(jī)構(gòu)帶來方便。</p><p> 1.3 操作環(huán)境 </p><p> MyEclipse 8.5 </p><p><b> 2 功能實(shí)現(xiàn)設(shè)計(jì)</b></p><p><b> 2.1 總體設(shè)計(jì)</b&g
34、t;</p><p> 根據(jù)上面的分析,將系統(tǒng)分為幾大部分:判斷身份證號的位數(shù)以及每一位是否正確,判斷出生年月是否符合實(shí)際,根據(jù)算法運(yùn)算對比校驗(yàn)碼是否正確,新舊身份證號轉(zhuǎn)換,提取輸出關(guān)鍵信息。</p><p> 2.1.1 程序設(shè)計(jì)組成框圖</p><p> 2.1.2 數(shù)據(jù)流圖</p><p><b> N</b&g
35、t;</p><p><b> Y</b></p><p> N Y</p><p><b> N</b></p><p><b> Y</b></p><p><b> N</b&
36、gt;</p><p><b> Y</b></p><p><b> 2.2 詳細(xì)設(shè)計(jì)</b></p><p> 2.2.1存放信息設(shè)計(jì)</p><p> 導(dǎo)包,定義一個接口類用于其他類實(shí)現(xiàn),定義個身份證類用于實(shí)現(xiàn)接口,定義存放年份,月份,天數(shù),性別,年齡,校驗(yàn)碼對應(yīng)表,校驗(yàn)碼,身份證號碼
37、,錯誤標(biāo)識的容器。</p><p> //定義一個接口用于其它類實(shí)現(xiàn)</p><p> interface IdCardInterFace {</p><p> int digitCheck (final String id);//位數(shù)檢查</p><p> boolean charCheck ();//字符檢查</p>
38、<p> boolean dateCheck ();//日期檢查</p><p> boolean efficacyCode ();//效驗(yàn)碼檢查</p><p><b> }</b></p><p> //定義個身份證類用于實(shí)現(xiàn)接口IdCardInterFace</p><p> class Id
39、Card implements IdCardInterFace {</p><p> public final static int systemTime = new GregorianCalendar ().get(Calendar.YEAR);//取得當(dāng)前系統(tǒng)年份</p><p> protected int year;//用于存放年份</p><p>
40、protected int month;//用于存放月份</p><p> protected int date;//用于存放日期天數(shù)</p><p> protected String sex;//用于存放性別</p><p> protected int age;//用于存放年齡</p><p> protected HashMa
41、p <Integer, String>remainGroup;//存放效驗(yàn)碼值對應(yīng)表</p><p> private int remainder;//存放效驗(yàn)碼</p><p> private int totals;//存放每一位字符值與它所對應(yīng)的加權(quán)因子的乘積的和</p><p> protected String id;//存放身份證號碼&
42、lt;/p><p> private static int DATE_SIGN;//存放日期錯誤標(biāo)志</p><p> 2.2.2 構(gòu)造函數(shù)設(shè)計(jì)</p><p> 之后定義構(gòu)造函數(shù),檢查各項(xiàng)的正確性。特別是二月的檢查,要區(qū)分平年和閏年 ,平年二月日期到28號,閏年為29號。構(gòu)造計(jì)算校驗(yàn)碼的函數(shù),運(yùn)用java語言的運(yùn)算規(guī)則,按照給出的校驗(yàn)碼計(jì)算規(guī)則計(jì)算校驗(yàn)碼。<
43、;/p><p><b> //定義構(gòu)造函數(shù)</b></p><p> public IdCard (){</p><p><b> }</b></p><p> public IdCard (String id){</p><p> this.id = id;</
44、p><p> //用于存放效驗(yàn)碼對應(yīng)表</p><p> remainGroup = new HashMap <Integer ,String>();</p><p> remainGroup.put (0, "1");</p><p> remainGroup.put (1, "0")
45、;</p><p> remainGroup.put (2, "X");</p><p> remainGroup.put (3, "9");</p><p> remainGroup.put (4, "8");</p><p> remainGroup.put (5, &q
46、uot;7");</p><p> remainGroup.put (6, "6");</p><p> remainGroup.put (7, "5");</p><p> remainGroup.put (8, "4");</p><p> remainGrou
47、p.put (9, "3");</p><p> remainGroup.put (10, "2");</p><p><b> }</b></p><p> //檢查位數(shù)的正確性</p><p> public int digitCheck (final String i
48、d){</p><p> if (id.length () == 18){</p><p> return 18;</p><p> }else if (id.length () == 15){</p><p> return 15;</p><p><b> }else{</b><
49、;/p><p><b> return 0;</b></p><p><b> }</b></p><p><b> }</b></p><p> //檢查每一位的正確性</p><p> public boolean charCheck (){&
50、lt;/p><p> if (id.length () == 17){</p><p> Pattern p = Pattern.compile ("[0-9]{17}");</p><p> Matcher m = p.matcher (id);</p><p> return m.matches ();</p
51、><p> }else if (id.length () == 18){</p><p> String str = id.substring (0, id.length () - 1);</p><p> String str1 = id.substring (id.length () - 1, id.length ());</p><p&g
52、t; Pattern p = Pattern.compile ("[0-9]{17}");</p><p> Matcher m = p.matcher (str);</p><p> if ((str1.matches ("\\d") || str1.equals ("X")) && m.matches (
53、)){</p><p> return true;</p><p><b> }else{</b></p><p> return false;</p><p><b> }</b></p><p><b> }else{</b></p&
54、gt;<p> Pattern p = Pattern.compile ("[0-9]{1,18}");</p><p> Matcher m = p.matcher (id);</p><p> return m.matches ();</p><p><b> }</b></p>&l
55、t;p><b> }</b></p><p> //檢查日期的正確性</p><p> public boolean dateCheck (){</p><p> year = Integer.parseInt (id.substring (6, 10));//取得年份</p><p> //判斷年份的正
56、確性</p><p> if (year < 1900 || year > IdCard.systemTime - 18){</p><p> DATE_SIGN = 1;</p><p> return false;</p><p><b> }else</b></p><p&g
57、t;<b> {</b></p><p> month = Integer.parseInt (id.substring (10, 12));//取得月份</p><p> //判斷月份的正確性</p><p> if (month <= 12){</p><p> //判斷天數(shù)的正確性</p>
58、;<p> date = Integer.parseInt (id.substring (12, 14));//取得天數(shù)</p><p> if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))//判斷是否為閏年</p><p><b> {</b></p>
59、<p> //判斷二月份的天數(shù)正確性</p><p> if (month == 2){</p><p> if (date <= 29){</p><p> return true;</p><p><b> }else{</b></p><p> DATE_SIG
60、N = 3;</p><p> return false;</p><p><b> }</b></p><p><b> }else{</b></p><p> //判斷其它月份的天數(shù)正確性</p><p> if ((month < 8 &&
61、; month % 2 != 0 && date <= 31) || (month < 8 && month % 2 == 0 && date <= 30)){</p><p> return true;</p><p> }else if ((month >= 8 && month % 2 ==
62、0 && date <= 31) || (month >= 8 && month % 2 != 0 && date <= 30)){</p><p> return true;</p><p><b> }else{</b></p><p> DATE_SIGN = 3;&
63、lt;/p><p> return false;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> //判斷平年的正確性</p><p>&l
64、t;b> else{</b></p><p> //判斷二月的天數(shù)正確性</p><p> if (month == 2){</p><p> if (date <= 28){</p><p> return true;</p><p><b> }else{</b&
65、gt;</p><p> DATE_SIGN = 3;</p><p> return false;</p><p><b> }</b></p><p><b> }else{</b></p><p> //判斷其它月份的天數(shù)正確性</p><
66、p> if ((month < 8 && month % 2 != 0 && date <= 31) || (month < 8 && month % 2 == 0 && date <= 30)){</p><p> return true;</p><p> }else if ((mont
67、h >= 8 && month % 2 == 0 && date <= 31) || (month >= 8 && month % 2 != 0 && date <= 30)){</p><p> return true;</p><p><b> }else{</b><
68、/p><p> DATE_SIGN = 3;</p><p> return false;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p>&
69、lt;b> }else{</b></p><p> DATE_SIGN = 2;</p><p> return false;</p><p><b> }</b></p><p><b> }</b></p><p> }// end of d
70、ateCheck</p><p><b> //}</b></p><p><b> //計(jì)算效驗(yàn)碼</b></p><p> public int computeEfficacyCode (){</p><p> if (id.length () == 18){</p>&l
71、t;p> for (int i = id.length (); i > 1; i--){</p><p> int ai = Integer.parseInt (id.substring (18-i, 19-i));</p><p> int wi = (int)Math.pow (2, i-1) % 11;</p><p> totals =
72、totals + ai * wi;</p><p><b> }</b></p><p><b> }</b></p><p><b> else{</b></p><p> for (int i = id.length () + 1; i > 1; i--){&
73、lt;/p><p> int ai = Integer.parseInt (id.substring (18-i, 19-i));</p><p> int wi = (int)Math.pow (2, i-1) % 11;</p><p> totals = totals + ai * wi;</p><p><b> }&l
74、t;/b></p><p><b> }</b></p><p> remainder = totals % 11;</p><p> return remainder;</p><p><b> }</b></p><p> 2.2.3 判斷信息是否正確&l
75、t;/p><p> 對于給定的身份證號,通過調(diào)用前面的構(gòu)造函數(shù),來驗(yàn)證各方面信息是否正確,出生年月日是否符合實(shí)際,特別是平年閏年二月的判定,性別的判定,以及由前17位計(jì)算出的校驗(yàn)碼是否和身份證號的第十八位的匹配。判定過程中運(yùn)用了很多循環(huán)語句,對于錯誤運(yùn)用java的異常處理。</p><p> //檢查日期的正確性</p><p> public boolean d
76、ateCheck (){</p><p> year = Integer.parseInt (id.substring (6, 10));//取得年份</p><p> //判斷年份的正確性</p><p> if (year < 1900 || year > IdCard.systemTime - 18){</p><p>
77、; DATE_SIGN = 1;</p><p> return false;</p><p><b> }else</b></p><p><b> {</b></p><p> month = Integer.parseInt (id.substring (10, 12));//取得月
78、份</p><p> //判斷月份的正確性</p><p> if (month <= 12){</p><p> //判斷天數(shù)的正確性</p><p> date = Integer.parseInt (id.substring (12, 14));//取得天數(shù)</p><p> if (year %
79、 4 == 0 && (year % 100 != 0 || year % 400 == 0))//判斷是否為閏年</p><p><b> {</b></p><p> //判斷二月份的天數(shù)正確性</p><p> if (month == 2){</p><p> if (date <=
80、 29){</p><p> return true;</p><p><b> }else{</b></p><p> DATE_SIGN = 3;</p><p> return false;</p><p><b> }</b></p><
81、p><b> }else{</b></p><p> //判斷其它月份的天數(shù)正確性</p><p> if ((month < 8 && month % 2 != 0 && date <= 31) || (month < 8 && month % 2 == 0 && date
82、 <= 30)){</p><p> return true;</p><p> }else if ((month >= 8 && month % 2 == 0 && date <= 31) || (month >= 8 && month % 2 != 0 && date <= 30)){&l
83、t;/p><p> return true;</p><p><b> }else{</b></p><p> DATE_SIGN = 3;</p><p> return false;</p><p><b> }</b></p><p>&l
84、t;b> }</b></p><p><b> }</b></p><p> //判斷平年的正確性</p><p><b> else{</b></p><p> //判斷二月的天數(shù)正確性</p><p> if (month == 2){<
85、;/p><p> if (date <= 28){</p><p> return true;</p><p><b> }else{</b></p><p> DATE_SIGN = 3;</p><p> return false;</p><p><
86、b> }</b></p><p><b> }else{</b></p><p> //判斷其它月份的天數(shù)正確性</p><p> if ((month < 8 && month % 2 != 0 && date <= 31) || (month < 8 &&a
87、mp; month % 2 == 0 && date <= 30)){</p><p> return true;</p><p> }else if ((month >= 8 && month % 2 == 0 && date <= 31) || (month >= 8 && month % 2
88、!= 0 && date <= 30)){</p><p> return true;</p><p><b> }else{</b></p><p> DATE_SIGN = 3;</p><p> return false;</p><p><b>
89、}</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }else{</b></p><p> DATE_SIGN = 2;</p><p> return false;&l
90、t;/p><p><b> }</b></p><p><b> }</b></p><p> }// end of dateCheck</p><p><b> //}</b></p><p><b> //計(jì)算效驗(yàn)碼</b>
91、;</p><p> public int computeEfficacyCode (){</p><p> if (id.length () == 18){</p><p> for (int i = id.length (); i > 1; i--){</p><p> int ai = Integer.parseInt (
92、id.substring (18-i, 19-i));</p><p> int wi = (int)Math.pow (2, i-1) % 11;</p><p> totals = totals + ai * wi;</p><p><b> }</b></p><p><b> }</b&g
93、t;</p><p><b> else{</b></p><p> for (int i = id.length () + 1; i > 1; i--){</p><p> int ai = Integer.parseInt (id.substring (18-i, 19-i));</p><p> in
94、t wi = (int)Math.pow (2, i-1) % 11;</p><p> totals = totals + ai * wi;</p><p><b> }</b></p><p><b> }</b></p><p> remainder = totals % 11;<
95、;/p><p> return remainder;</p><p><b> }</b></p><p> 2.2.4 新舊身份證號轉(zhuǎn)換</p><p> 考慮到現(xiàn)在還確實(shí)存在一些舊身份證,特設(shè)計(jì)了此模塊用于新舊身份證的轉(zhuǎn)換。按照新舊身份證的轉(zhuǎn)換規(guī)則,進(jìn)行新舊身份證號的轉(zhuǎn)換。</p><p>
96、; //定義一個NewIdCard類用于進(jìn)行新身份證號碼的操作</p><p> class NewIdCard extends IdCard{</p><p> public String newId;</p><p> public StringBuffer oldId;</p><p> public NewIdCard (S
97、tring newId){</p><p> super (newId);</p><p> this.newId = newId;</p><p><b> }</b></p><p> //用于將新身份證號碼轉(zhuǎn)換成舊身份證號碼</p><p> public void newToOl
98、dIdCard (){</p><p> oldId = new StringBuffer (newId);</p><p> oldId = oldId.delete (6, 8);</p><p> oldId = new StringBuffer (oldId.substring (0, oldId.length () - 1));</p>
99、<p><b> }</b></p><p><b> }</b></p><p> 2.2.5 窗口類的創(chuàng)建及實(shí)現(xiàn)</p><p> 為了方便用戶使用該套程序,創(chuàng)建一個窗口類,便于輸入和直觀的將結(jié)果展現(xiàn)用戶眼前。創(chuàng)建窗口類過程中主要是用到了java的組件的相關(guān)功能,同時還有事件處理機(jī)制,用于鼠標(biāo)和鍵盤
100、的輸入處理。關(guān)鍵程序如下</p><p><b> //定義個窗口類</b></p><p> class IdCardGui extends Frame{</p><p> public Label lb = new Label ();</p><p> public JDialog dialog;</p
101、><p> public static String strError = null;</p><p> private String id;</p><p><b> //初使化對文本框</b></p><p> public JTextField tf1;</p><p> public
102、 JTextField tf2 = new JTextField ("", 23);</p><p> public JTextField tf3 = new JTextField ("", 23);</p><p> public JTextField tf4 = new JTextField ("", 23);</p
103、><p> public JTextField tf5 = new JTextField ("", 23);</p><p> public JTextField tf6 = new JTextField ("", 23);</p><p> JButton bt = new JButton ("查詢")
104、;</p><p><b> 3 運(yùn)行結(jié)果</b></p><p> 圖3.1 顯示主菜單</p><p> 圖3.2 位數(shù)輸入錯誤</p><p> 圖3.3 檢查每一位是否正確</p><p> 圖3.4 月份對應(yīng)日期有誤(平年二月無29日)</p><p>
105、 圖3.5 校驗(yàn)碼有誤</p><p> 圖3.6最終正確運(yùn)行界面</p><p><b> 4 總結(jié)</b></p><p> 本次課程設(shè)計(jì)不僅完成了題目要的要求,而且實(shí)現(xiàn)了程序的普遍化,能夠適應(yīng)更普遍的情況,而且考慮到實(shí)際情況,添加了自己的創(chuàng)新模塊,進(jìn)行十八位十五位互轉(zhuǎn),在此程序設(shè)計(jì)過程中用到了java的很多知識,接口,數(shù)組,循環(huán)語
106、句,容器,異常處理,同時也注意到了代碼的優(yōu)化,針對好多問題進(jìn)行最優(yōu)化處理,讓代碼在通俗易懂的情況下更加簡潔。但是程序還是存在一些問題,本來想要將身份證所代表的地區(qū)加進(jìn)去,但是由于地區(qū)牽扯到的鏈接過于復(fù)雜,我就放棄了這個想法,但是我認(rèn)為隨著我技術(shù)的進(jìn)步,這個問題會在不久的將來得到解決。</p><p> 通過這次課程設(shè)計(jì),我對java有了更深層次的理解,同時也對java有了更濃厚的興趣,正應(yīng)了那句話, 一切程序都
107、源于生活,一切程序都服務(wù)生活,編代碼寫程序也是為了給人們的生活帶來方便。</p><p><b> 參考文獻(xiàn)</b></p><p> [1] 印旻. Java與面向?qū)ο蟪绦蛟O(shè)計(jì)教程.北京:高等教育出版社,1999</p><p> [2] 張利國,劉偉. Java SE.北京:科學(xué)出版社,2008</p><p>
108、; [3] (美)昊斯特曼(Horstmann,C.S.).Java核心技術(shù).北京:機(jī)械工程出版社,2008,5</p><p> [4] (美)埃克爾 著,陳昊鵬 譯. Java編程思想(第4版).北京:機(jī)械工業(yè)出版社,2007,6</p><p> [5] 李興華. Java開發(fā)實(shí)戰(zhàn)經(jīng)典.北京:清華大學(xué)出版社,2009,8</p><p><b>
109、; 附錄 源程序清單</b></p><p> package kechengsheji0;</p><p> import java.util.*;</p><p> import java.awt.*;</p><p> import java.awt.event.*;</p><p> i
110、mport javax.swing.*;</p><p> import java.util.regex.*;</p><p> import javax.swing.text.*;</p><p> //定義一個接口用于其它類實(shí)現(xiàn)</p><p> interface IdCardInterFace {</p><
111、;p> int digitCheck (final String id);//位數(shù)檢查</p><p> boolean charCheck ();//字符檢查</p><p> boolean dateCheck ();//日期檢查</p><p> boolean efficacyCode ();//效驗(yàn)碼檢查</p><p&g
112、t;<b> }</b></p><p> //定義個身份證類用于實(shí)現(xiàn)接口IdCardInterFace</p><p> class IdCard implements IdCardInterFace {</p><p> public final static int systemTime = new GregorianCalend
113、ar ().get(Calendar.YEAR);//取得當(dāng)前系統(tǒng)年份</p><p> protected int year;//用于存放年份</p><p> protected int month;//用于存放月份</p><p> protected int date;//用于存放日期天數(shù)</p><p> protected
114、 String sex;//用于存放性別</p><p> protected int age;//用于存放年齡</p><p> protected HashMap <Integer, String>remainGroup;//存放效驗(yàn)碼值對應(yīng)表</p><p> private int remainder;//存放效驗(yàn)碼</p>
115、<p> private int totals;//存放每一位字符值與它所對應(yīng)的加權(quán)因子的乘積的和</p><p> protected String id;//存放身份證號碼</p><p> private static int DATE_SIGN;//存放日期錯誤標(biāo)志</p><p><b> //定義構(gòu)造函數(shù)</b>&
116、lt;/p><p> public IdCard (){</p><p><b> }</b></p><p> public IdCard (String id){</p><p> this.id = id;</p><p> //用于存放效驗(yàn)碼對應(yīng)表</p><p&
117、gt; remainGroup = new HashMap <Integer ,String>();</p><p> remainGroup.put (0, "1");</p><p> remainGroup.put (1, "0");</p><p> remainGroup.put (2, &quo
118、t;X");</p><p> remainGroup.put (3, "9");</p><p> remainGroup.put (4, "8");</p><p> remainGroup.put (5, "7");</p><p> remainGroup.
119、put (6, "6");</p><p> remainGroup.put (7, "5");</p><p> remainGroup.put (8, "4");</p><p> remainGroup.put (9, "3");</p><p>
120、remainGroup.put (10, "2");</p><p><b> }</b></p><p> //檢查位數(shù)的正確性</p><p> public int digitCheck (final String id){</p><p> if (id.length () == 18
121、){</p><p> return 18;</p><p> }else if (id.length () == 15){</p><p> return 15;</p><p><b> }else{</b></p><p><b> return 0;</b>
122、</p><p><b> }</b></p><p><b> }</b></p><p> //檢查每一位的正確性</p><p> public boolean charCheck (){</p><p> if (id.length () == 17){&l
123、t;/p><p> Pattern p = Pattern.compile ("[0-9]{17}");</p><p> Matcher m = p.matcher (id);</p><p> return m.matches ();</p><p> }else if (id.length () == 18){&
124、lt;/p><p> String str = id.substring (0, id.length () - 1);</p><p> String str1 = id.substring (id.length () - 1, id.length ());</p><p> Pattern p = Pattern.compile ("[0-9]{17}
125、");</p><p> Matcher m = p.matcher (str);</p><p> if ((str1.matches ("\\d") || str1.equals ("X")) && m.matches ()){</p><p> return true;</p>
126、<p><b> }else{</b></p><p> return false;</p><p><b> }</b></p><p><b> }else{</b></p><p> Pattern p = Pattern.compile (&qu
127、ot;[0-9]{1,18}");</p><p> Matcher m = p.matcher (id);</p><p> return m.matches ();</p><p><b> }</b></p><p><b> }</b></p><p&g
128、t; //檢查日期的正確性</p><p> public boolean dateCheck (){</p><p> year = Integer.parseInt (id.substring (6, 10));//取得年份</p><p> //判斷年份的正確性</p><p> if (year < 1900 || y
129、ear > IdCard.systemTime - 18){</p><p> DATE_SIGN = 1;</p><p> return false;</p><p><b> }else</b></p><p><b> {</b></p><p> m
130、onth = Integer.parseInt (id.substring (10, 12));//取得月份</p><p> //判斷月份的正確性</p><p> if (month <= 12){</p><p> //判斷天數(shù)的正確性</p><p> date = Integer.parseInt (id.substr
131、ing (12, 14));//取得天數(shù)</p><p> if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))//判斷是否為閏年</p><p><b> {</b></p><p> //判斷二月份的天數(shù)正確性</p><p>
132、if (month == 2){</p><p> if (date <= 29){</p><p> return true;</p><p><b> }else{</b></p><p> DATE_SIGN = 3;</p><p> return false;</p
133、><p><b> }</b></p><p><b> }else{</b></p><p> //判斷其它月份的天數(shù)正確性</p><p> if ((month < 8 && month % 2 != 0 && date <= 31) || (m
134、onth < 8 && month % 2 == 0 && date <= 30)){</p><p> return true;</p><p> }else if ((month >= 8 && month % 2 == 0 && date <= 31) || (month >= 8 &a
135、mp;& month % 2 != 0 && date <= 30)){</p><p> return true;</p><p><b> }else{</b></p><p> DATE_SIGN = 3;</p><p> return false;</p>&
136、lt;p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> //判斷平年的正確性</p><p><b> else{</b></p><p> /
137、/判斷二月的天數(shù)正確性</p><p> if (month == 2){</p><p> if (date <= 28){</p><p> return true;</p><p><b> }else{</b></p><p> DATE_SIGN = 3;</p&g
138、t;<p> return false;</p><p><b> }</b></p><p><b> }else{</b></p><p> //判斷其它月份的天數(shù)正確性</p><p> if ((month < 8 && month % 2 !=
139、 0 && date <= 31) || (month < 8 && month % 2 == 0 && date <= 30)){</p><p> return true;</p><p> }else if ((month >= 8 && month % 2 == 0 && d
140、ate <= 31) || (month >= 8 && month % 2 != 0 && date <= 30)){</p><p> return true;</p><p><b> }else{</b></p><p> DATE_SIGN = 3;</p><
141、;p> return false;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }else{</b></p><p>
142、 DATE_SIGN = 2;</p><p> return false;</p><p><b> }</b></p><p><b> }</b></p><p> }// end of dateCheck</p><p><b> //}</
143、b></p><p><b> //計(jì)算效驗(yàn)碼</b></p><p> public int computeEfficacyCode (){</p><p> if (id.length () == 18){</p><p> for (int i = id.length (); i > 1; i-
144、-){</p><p> int ai = Integer.parseInt (id.substring (18-i, 19-i));</p><p> int wi = (int)Math.pow (2, i-1) % 11;</p><p> totals = totals + ai * wi;</p><p><b>
145、 }</b></p><p><b> }</b></p><p><b> else{</b></p><p> for (int i = id.length () + 1; i > 1; i--){</p><p> int ai = Integer.parseInt
146、(id.substring (18-i, 19-i));</p><p> int wi = (int)Math.pow (2, i-1) % 11;</p><p> totals = totals + ai * wi;</p><p><b> }</b></p><p><b> }</b&
147、gt;</p><p> remainder = totals % 11;</p><p> return remainder;</p><p><b> }</b></p><p> //判斷效驗(yàn)碼的正確性</p><p> public boolean efficacyCode ()
148、{</p><p> this.computeEfficacyCode ();</p><p> if (id.substring (id.length () - 1 , id.length ()).equals (remainGroup.get (remainder))){</p><p> return true;</p><p>
149、<b> }else{</b></p><p> return false;</p><p><b> }</b></p><p><b> }</b></p><p> //判斷身份證號碼的正確性</p><p> public boole
150、an idJudge (){</p><p> boolean b;</p><p> String str;</p><p> b = charCheck ();//進(jìn)行每一位檢查</p><p><b> if (b){</b></p><p> b = dateCheck ();/
151、/進(jìn)行日期檢查</p><p><b> if (b){</b></p><p> if (id.length () == 18){</p><p> b = efficacyCode ();//進(jìn)行效驗(yàn)碼判斷</p><p><b> if (b){</b></p><
152、p> return true;</p><p><b> }else{</b></p><p> IdCardGui.strError = "效驗(yàn)碼有誤(最后一位),請重新輸入!";</p><p><b> }</b></p><p><b> }el
153、se{</b></p><p> return true;</p><p><b> }</b></p><p><b> }else{</b></p><p> switch (DATE_SIGN){</p><p><b> case 1
154、:</b></p><p> IdCardGui.strError = "年份輸入有誤(1900~ " + (IdCard.systemTime - 16) + "),請重新輸入!";</p><p><b> break;</b></p><p><b> case 2 :&
155、lt;/b></p><p> IdCardGui.strError = "月分輸入有誤(1~12),請重新輸入!";</p><p><b> break;</b></p><p><b> case 3 :</b></p><p> IdCardGui.strE
156、rror = month + "月所在的天數(shù)有誤,請重新輸入!";</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }else{</
157、b></p><p> IdCardGui.strError = "含有特殊字符, 請重新輸入!";</p><p><b> }</b></p><p><b> return b;</b></p><p><b> }</b></p&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 身份證號碼集錦
- 身份證號碼各位的含義
- 公民身份證號碼更正證明
- 全國各地身份證號碼段
- 公民身份證號碼變更證明表
- 公民身份證號碼變更證明表
- 身份證號碼前6位查詢大全
- 基于MATLAB的身份證號碼識別算法.pdf
- 用matlab實(shí)現(xiàn)身份證號碼快速識別
- 身份證號大全:防沉迷身份證號碼,身份證號大全防沉迷
- 基于度序列的身份證號碼識別研究.pdf
- 全國各地區(qū)身份證號碼大全(一)
- 用excel自動解讀身份證號碼信息的方法
- 全國各地區(qū)身份證號碼大全(一)
- 嵌入式期末課程設(shè)計(jì)報告-c語言實(shí)現(xiàn)身份證號碼信息查詢
- 新生學(xué)信網(wǎng)注冊身份證號碼重復(fù)異常指南
- 轉(zhuǎn)excel表格中根據(jù)身份證號碼自動填出生日期
- 身份證號大權(quán)身份證號大全
- 王文博 身份證號
- 全國身份證號地區(qū)對應(yīng)表
評論
0/150
提交評論