added Luhn algorithm / validator

This commit is contained in:
jomu
2014-03-12 21:18:33 +00:00
parent 3ea51432ab
commit bdb19377ed
2 changed files with 118 additions and 0 deletions

View File

@ -0,0 +1,61 @@
/*
* File: $$RCSfile$$
*
* Copyright (c) 2011 by Wincor Nixdorf,
* Heinz-Nixdorf-Ring 1, 33106 Paderborn, Germany
*
* This software is the confidential and proprietary information
* of Wincor Nixdorf.
*
* You shall not disclose such confidential information and shall
* use it only in accordance with the terms of the license agreement
* you entered into with Wincor Nixdorf.
*/
package de.muehlencord.shared.security;
/**
*
* @author joern.muehlencord
*/
public class Luhn {
public static boolean validateNumber(final String numberStr) {
return (computeCheckDigit(numberStr, true) == 0);
}
public static int computeCheckDigit(final String numberStr, final boolean isCheckDigitAttached) {
boolean doubleNextDigit = !isCheckDigitAttached;
int sum = 0;
// iterate from right digit to left
for (int currentDigitPos = numberStr.length() - 1; currentDigitPos >= 0; currentDigitPos--) {
int currentDigit = Integer.parseInt(String.valueOf(numberStr.charAt(currentDigitPos)));
if (doubleNextDigit) {
currentDigit = currentDigit * 2;
}
sum += singleDigitSum(currentDigit);
doubleNextDigit = !doubleNextDigit;
}
if ((sum % 10) > 0) {
return (10 - (sum % 10));
} else {
return 0;
}
}
private static int singleDigitSum(final int value) {
if (value < 10) {
return value;
} else {
return singleDigitSum((value / 10) + (value % 10));
}
}
}
/**
* History:
*
* $$Log$$
*
*/

View File

@ -0,0 +1,57 @@
/*
* File: $$RCSfile$$
*
* Copyright (c) 2011 by Wincor Nixdorf,
* Heinz-Nixdorf-Ring 1, 33106 Paderborn, Germany
*
* This software is the confidential and proprietary information
* of Wincor Nixdorf.
*
* You shall not disclose such confidential information and shall
* use it only in accordance with the terms of the license agreement
* you entered into with Wincor Nixdorf.
*/
package de.muehlencord.shared.security;
import org.junit.Test;
import static org.junit.Assert.*;
/**
*
* @author joern.muehlencord
*/
public class LuhnTest {
public LuhnTest() {
}
@Test
public void testComputeCheckDigit() {
String testString = "7992739871";
int checkNumber = Luhn.computeCheckDigit(testString, false);
System.out.println(checkNumber);
assertTrue(checkNumber == 3);
}
@Test
public void testValidateNumber() {
assertFalse(Luhn.validateNumber("79927398710"));
assertFalse(Luhn.validateNumber("79927398711"));
assertFalse(Luhn.validateNumber("79927398712"));
assertTrue(Luhn.validateNumber("79927398713"));
assertFalse(Luhn.validateNumber("79927398714"));
assertFalse(Luhn.validateNumber("79927398715"));
assertFalse(Luhn.validateNumber("79927398716"));
assertFalse(Luhn.validateNumber("79927398717"));
assertFalse(Luhn.validateNumber("79927398718"));
assertFalse(Luhn.validateNumber("79927398719"));
}
}
/**
* History:
*
* $$Log$$
*
*/