Added validateCreditMethod standalone method

This commit is contained in:
Erik C. Thauvin 2023-03-23 20:37:01 -07:00
parent f264bb43bc
commit 79cbf76761
4 changed files with 65 additions and 43 deletions

View file

@ -24,7 +24,7 @@ This project provides a collection of useful template renderers.
## Encoding Renderers ## Encoding Renderers
| Renderer | Description | | Renderer | Description |
|:--------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------| |:------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------|
| [rife.render.EncodeBase64](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeBase64) | Encodes a template value to Base64 | | [rife.render.EncodeBase64](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeBase64) | Encodes a template value to Base64 |
| [rife.render.EncodeHtml](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeHtml) | Encodes a template value to HTML | | [rife.render.EncodeHtml](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeHtml) | Encodes a template value to HTML |
| [rife.render.EncodeHtmlEntities](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeHtmlEntities) | Encodes a template value to HTML decimal entities | | [rife.render.EncodeHtmlEntities](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeHtmlEntities) | Encodes a template value to HTML decimal entities |

View file

@ -13,7 +13,7 @@ plugins {
id("com.github.ben-manes.versions") version "0.46.0" id("com.github.ben-manes.versions") version "0.46.0"
} }
val rifeVersion by rootProject.extra { "1.5.4" } val rifeVersion by rootProject.extra { "1.5.5" }
group = "com.uwyn.rife2" group = "com.uwyn.rife2"
version = "1.0.1-SNAPSHOT" version = "1.0.1-SNAPSHOT"

View file

@ -192,39 +192,14 @@ public final class RenderUtils {
return src; return src;
} }
try {
var cc = src.replaceAll("[^0-9]", ""); var cc = src.replaceAll("[^0-9]", "");
var len = cc.length(); if (validateCreditCard(cc)) {
if (len >= 4) { return cc.substring(cc.length() - 4);
// Luhn algorithm } else {
var sum = 0;
boolean isSecond = false;
int digit;
char c;
for (int i = len - 1; i >= 0; i--) {
c = cc.charAt(i);
if (c >= '0' && c <= '9') {
digit = cc.charAt(i) - '0';
if (isSecond) {
digit = digit * 2;
}
sum += digit / 10;
sum += digit % 10;
}
isSecond = !isSecond;
}
if (sum % 10 == 0) {
return cc.substring(len - 4);
}
}
} catch (NumberFormatException ignore) {
// do nothing
}
return ""; return "";
} }
}
/** /**
* Converts a text String to HTML decimal entities. * Converts a text String to HTML decimal entities.
@ -520,4 +495,42 @@ public final class RenderUtils {
return sb.toString(); return sb.toString();
} }
/**
* Validates a credit card number using the Luhn algorithm.
*
* @param cc the credit card number
* @return {@code trude} if the credit card number is valid
*/
public static boolean validateCreditCard(String cc) {
try {
var len = cc.length();
if (len >= 8 && len <= 19) {
// Luhn algorithm
var sum = 0;
boolean second = false;
int digit;
char c;
for (int i = len - 1; i >= 0; i--) {
c = cc.charAt(i);
if (c >= '0' && c <= '9') {
digit = cc.charAt(i) - '0';
if (second) {
digit = digit * 2;
}
sum += digit / 10;
sum += digit % 10;
second = !second;
}
}
if (sum % 10 == 0) {
return true;
}
}
} catch (NumberFormatException ignore) {
// do nothing
}
return false;
}
} }

View file

@ -83,4 +83,13 @@ class TestRenderUtils {
assertThat(RenderUtils.uncapitalize("A")).isEqualTo("a"); assertThat(RenderUtils.uncapitalize("A")).isEqualTo("a");
assertThat(RenderUtils.uncapitalize("")).as("empty").isEqualTo(""); assertThat(RenderUtils.uncapitalize("")).as("empty").isEqualTo("");
} }
@Test
void testValidateCreditCard() {
assertThat(RenderUtils.validateCreditCard("4505 4672 3366 6430")).as("visa").isTrue();
assertThat(RenderUtils.validateCreditCard("5189-5923-3915-0425")).as("mastercard").isTrue();
assertThat(RenderUtils.validateCreditCard("3433634926643302")).as("amex").isTrue();
assertThat(RenderUtils.validateCreditCard("6011 1076-8252 0629")).as("discover").isTrue();
assertThat(RenderUtils.validateCreditCard("0123456789012345")).as("invalid").isFalse();
}
} }