Jag skulle behöva en metod till min klass som man kan skicka in personnummret till för validering. Det ska då kontrollera om personnummret stämmer. Man skickar in personnummret på formlen ååååmmdd-xxxx.
Jag vill att om man är under 18 år så ska false returneras men även om inte personnummret stämmer, annars ska true returneras. Hur gör man en sådan metod??
Använd metoden substring för att plocka ut en del av en sträng (förslagsvis årtalet, månaden, datumet och de fyra sista). Sen lägger du in dem i integers varpå du kan räkna med dem.
För att kolla om man är under 18 år börjar du med att jämföra årtalet med aktuellt år. Skiljer det exakt 18 år måste du även kolla månaden (och kanske dagen) mot den aktuella, skiljer det mer eller mindre så vet du ju.
Sen är det ju bara att kolla att årtalet, månaden och dagen befinner sig inom tillåtna (tänk dock på att antalet dagar i en månad varierar med månaden och året (skottår)).
Reglerna för skottår är för övrigt vart fjärde år men inte vart hundrade, dock vart fyrhundrade.
public class PersonNummer {
public static void main(String[] args) {
String pnr = ""; //byt ut mot "YYMMDDXXXX"
if(isPnrLegal(pnr)) {
System.out.println("Giltligt!");
}
else {
System.out.println("Ogiltligt!");
}
}
public static boolean isPnrLegal(String s) {
int[] pnr = stringToArray(s);
int control = calculateControlNumber(pnr);
return pnr[pnr.length-1] == control;
}
private static int[] stringToArray(String s) {
int arr[] = new int[s.length()];
for(int i = 0; i < s.length(); i++) {
arr[i] = (new Integer("" + s.charAt(i))).intValue();
}
return arr;
}
private static int calculateControlNumber(int[] arr) {
int checkSum = 0;
int temp = 0;
int controlNumber;
for(int i = 0; i < 9; i++) {
if(i % 2 == 0) {
temp = 2*arr[i];
if(temp >= 10) {
checkSum = checkSum + 1 + (temp - 10);
}
else {
checkSum = checkSum + temp;
}
}
else {
checkSum = checkSum + arr[i];
}
}
controlNumber = 10 - checkSum % 10;
if(controlNumber == 10) {
controlNumber = 0;
}
return controlNumber;
}
}
Men jag vet dock inte redigt hur jag ska anpassa den till det jag vill använda den till. (skipar år kollen så länge) Jag vill ju enbart skicka in en sträng, som sedan ska returnera true/false.
Det enklaste du kan göra är att parsa datum-delen mha SimpleDateFormat (pnr_date). Den validerar även att datumet är korrekt vad gäller månader och år. Sedan är det enkelt att skapa ett nytt datum som är 18 år före dagens datum (today) och använda pnr_date.before(today) på det.
Att sedan validera kontrollsiffrorna har du ju redan löst.
public class PersonNummer {
public static boolean isPnrLegal(String s)
{
int[] pnr = stringToArray(s);
int control = calculateControlNumber(pnr);
return pnr[pnr.length-1] == control;
}
private static int[] stringToArray(String s) {
int arr[] = new int[s.length()];
for(int i = 0; i < s.length(); i++) {
if(!(i==8))
{
arr[i] = (new Integer("" + s.charAt(i))).intValue();
}
}
return arr;
}
private static int calculateControlNumber(int[] arr) {
int checkSum = 0;
int temp = 0;
int controlNumber;
for(int i = 0; i < 11; i++) {
if(i % 2 == 0) {
temp = 2*arr[i];
if(temp >= 12) {
checkSum = checkSum + 1 + (temp - 12);
}
else {
checkSum = checkSum + temp;
}
}
else {
checkSum = checkSum + arr[i];
}
}
controlNumber = 12 - checkSum % 12;
if(controlNumber == 12) {
controlNumber = 0;
}
return controlNumber;
}
}
Det är metoden stringToArray jag har problem med. Nu försöker jag plocka ut det 9 tecknet vilket är -. Men då skrivs ju en 0:a in i arrayen istället på dess plats, vilket ger fel längre fram i koden. Hur gör jag för att plocka bort - från födelsedatumet?? yyyymmdd-xxxx