| HetuTarkistus.java |
1 package kanta;
2
3
4 /**
5 * Luokka henkilötunnuksen tarkistamiseksi
6 * @author vesal
7 * @version 9.1.2011
8 *
9 */
10 public class HetuTarkistus {
11 /** Hetuun kelpaavat tarkistusmerkit järjestyksessä */
12 // 0123456789012345678901234567890
13 public static final String TARKISTUSMERKIT = "0123456789ABCDEFHJKLMNPRSTUVWXY";
14
15
16 /**
17 * Palauttaa mikä olisi hetun tarkistumerkki. Tuotava parametrinä
18 * laillista muotoa oleva hetu, josta mahdollisesti tarkistumerkki
19 * puuttuu.
20 * @param hetu tutkittava hetu
21 * @return hetun tarkistusmerkki
22 * @example
23 * <pre name="test">
24 * hetunTarkistusMerkki("121212-222") === 'N';
25 * hetunTarkistusMerkki("121212-222S") === 'N';
26 * hetunTarkistusMerkki("121212-222N") === 'N';
27 * hetunTarkistusMerkki("121212-231Y") === 'Y';
28 * hetunTarkistusMerkki("311212-2317") === '7';
29 * hetunTarkistusMerkki("311212-2317XY") === '7'; // vaikka on liikaa merkkejä
30 * hetunTarkistusMerkki("999999-9999XY") === 'F'; // vaikka on pvm väärin
31 * hetunTarkistusMerkki("12121A-222S") === 'N'; #THROWS NumberFormatException
32 * hetunTarkistusMerkki("12121A-22") === 'N'; #THROWS StringIndexOutOfBoundsException
33 * hetunTarkistusMerkki("121") === 'N'; #THROWS StringIndexOutOfBoundsException
34 * </pre>
35 */
36 public static char hetunTarkistusMerkki(String hetu) {
37 String pvm = hetu.substring(0,6);
38 String yksilo = hetu.substring(7,10);
39 long luku = Long.parseLong(pvm+yksilo);
40 int jakojaannos = (int)(luku % 31L);
41 return TARKISTUSMERKIT.charAt(jakojaannos);
42 }
43
44
45 /**
46 * Arvotaan satunnainen kokonaisluku välille [ala,yla]
47 * @param ala arvonnan alaraja
48 * @param yla arvonnan yläraja
49 * @return satunnainen luku väliltä [ala,yla]
50 */
51 public static int rand(int ala, int yla) {
52 double n = (yla-ala)*Math.random() + ala;
53 return (int)Math.round(n);
54 }
55
56
57 /**
58 * Arvotaan satunnainen henkilötunnus, joka täyttää hetun ehdot
59 * @return satunnainen laillinen henkilötunnus
60 */
61 public static String arvoHetu() {
62 String apuhetu = String.format("%02d",rand(1,28)) +
63 String.format("%02d",rand(1,12)) +
64 String.format("%02d",rand(1,99)) + "-" +
65 String.format("%03d",rand(1,1000));
66 return apuhetu + hetunTarkistusMerkki(apuhetu);
67 }
68
69 }
70