Hej Deklarera klassen PersonNummer så här: tack, men jag får ett felmeddelande: Varför göra det så komplicerat? ok, tack för det exemplet, men skulle vara kul att få den andra att fungera oxå :D Du kan inte bara byta ut 10 mot 12 i algorimen, eftersom kontrollsiffran genererats med de nio första siffrorna: ååmmddxxx.kontrollera personnummer
Jag beöver hjälp med en metod som ska validera personnummret på formlen ååååmmdd-xxxx.
Den ska kontrollera så kontroll siffran stämmer.
Hittade denna via google:
<code>
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;
}
}
</code>
Men vet inte redigt hur jag ska lösa det. Man ska skick in strängen med personnummret till metoden sen så ska tru eller false returneras.
Hur löser jag detta??
Tacksam för all hjälpSv: kontrollera personnummer
(Lyft bara ut main-funktionen)
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++) {
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;
}
}
Anropa utanför klassen:
boolean legal= PersonNummer.isPnrLegal("ååååmmdd-xxxx");Sv:kontrollera personnummer
For input string: "-"
jag skickar in ett 12 siffrígt samt ett -.
Personnummerkontrollen tillåter inte ett - i födelsenummret?
Då måste man ju plocka bort - från födelsedatummet.
Hur får jag denna att fungera??Sv: kontrollera personnummer
Brukar göra så här för att kolla personnummer
(är dock inte så bra på java. Kan man använda foreach på string?)
bool checkpnr(string pnr) {
int digitcount = 0;
int sum = 0;
for (int ii = 0; ii < pnr.length(); ++ii) {
char c = pnr.charAt(ii);
int digit = Character.digit(c,10);
if (digit < 0) {
if (c == " " || c == "-") // vilka tecken som är tillåtna
continue;
else
return false; // ogiltigt tecken
}
if (digitcount % 2 == 0) {
if (digit >= 5)
digit = digit * 2 - 9;
else
digit = digit * 2
}
sum = sum + digit;
++digitcount;
}
return digitcount == 10 && sum % 10 == 0;
}
Sv:kontrollera personnummer
har nu följand ekod iaf:
<code>
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 < 12; 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;
}
</code>
men den säger bara att det är fel, även när det är ett rätt personnummer.
vad kan det vara för fel??Sv: kontrollera personnummer
Algoritmen som används är känd som "Luhn algoritmen" eller "modulo 10-algoritmen", se t.ex. en.wikipedia.org/wiki/Luhn.
För att den implementation du har ska funka måste du ta bort sekelsiffrorna och '-' innan du validerar.
s.substring(2) bör funka för att bli av med sekelsiffrorna.