webForumDet fria alternativet

validera personnummer

11 svar · 1 386 visningar · startad av Vinnaren

VinnarenMedlem sedan sep. 2005858 inlägg
#1

Hej

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??

Tacksam för all hjälp jag kan få :stud

LaspMedlem sedan juli 200010 197 inlägg
#2

Sök du på validering av personnummer, sedan är det väl en rutin för sig som säger om det är under aderton år.

TravoniMedlem sedan okt. 20041 538 inlägg
#3

Borde inte vara så svår att skriva om:
http://www.jojoxx.net/jscript/archive/show.asp?id=83

tydalMedlem sedan juni 20033 788 inlägg
#4

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.

VinnarenMedlem sedan sep. 2005858 inlägg
#5

ok, efter lite googlande hittade jag denna:

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.

LimeMedlem sedan sep. 2001837 inlägg
#6

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.

VinnarenMedlem sedan sep. 2005858 inlägg
#7

oki.

Man jag får inte kontrollen att fungera.

Har nu följande kod:

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

LimeMedlem sedan sep. 2001837 inlägg
#8

Vinnaren skrev:

Hur gör jag för att plocka bort - från födelsedatumet?? yyyymmdd-xxxx

String pnr = "070523-0914";
pnr = pnr.replace('-','');

Läser ingen API-dokumentationen mera??

VinnarenMedlem sedan sep. 2005858 inlägg
#9

tack, men det fungerar inte redigt. När jag provkör får jag följande felmeddelande:
For input string: " "

jag vill inte ersätta - utan den ska tas bort

Hur löser jag det?

LimeMedlem sedan sep. 2001837 inlägg
#10

*mummel* Varför läser jag inte API't ordentligt.

Du måste använda varianten som tar två strängar och göra
pnr.replace("-","");

istället...

VinnarenMedlem sedan sep. 2005858 inlägg
#11

tack, nu funkar det :bire

  public static boolean isPnrLegal(String s) 
    {    	
    	String ss = s;
        ss = ss.replace("-","");
    	
    	
        int[] pnr = stringToArray(ss); 

        
        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 < 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; 
    }

Men valideringen funkar inte, den säger att det är fel, även att personnummret är rätt.

VinnarenMedlem sedan sep. 2005858 inlägg
#12

jag löste det genom att ta bort de 2 första siffrorna i årtalet (y) :bla

Genererad på 392 ms · cache AV · v20260730165559-full.f96bc7eb