com.github.javafaker.Finance Maven / Gradle / Ivy
package com.github.javafaker;
import org.apache.commons.lang3.StringUtils;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Finance {
private final Faker faker;
protected Finance(Faker faker) {
this.faker = faker;
}
private static final Map countryCodeToBasicBankAccountNumberPattern =
createCountryCodeToBasicBankAccountNumberPatternMap();
public String creditCard(CreditCardType creditCardType) {
final String key = String.format("finance.credit_card.%s", creditCardType.toString().toLowerCase());
String value = faker.fakeValuesService().resolve(key, this, faker);
final String template = faker.numerify(value);
String[] split = template.replaceAll("[^0-9]", "").split("");
List reversedAsInt = new ArrayList();
for (int i = 0; i < split.length; i++) {
final String current = split[split.length - 1 - i];
if (!current.isEmpty()) {
reversedAsInt.add(Integer.valueOf(current));
}
}
int luhnSum = 0;
int multiplier = 1;
for (Integer digit : reversedAsInt) {
multiplier = (multiplier == 2 ? 1 : 2);
luhnSum += sum(String.valueOf(digit * multiplier).split(""));
}
int luhnDigit = (10 - (luhnSum % 10)) % 10;
return template.replace('\\', ' ').replace('/', ' ').trim().replace('L', String.valueOf(luhnDigit).charAt(0));
}
public String creditCard() {
CreditCardType type = randomCreditCardType();
return creditCard(type);
}
/**
* Generates a random Business Identifier Code
*/
public String bic() {
return faker.regexify("([A-Z]){4}([A-Z]){2}([0-9A-Z]){2}([0-9A-Z]{3})?");
}
public String iban() {
List countryCodes = new ArrayList(countryCodeToBasicBankAccountNumberPattern.keySet());
String randomCountryCode = countryCodes.get(faker.random().nextInt(countryCodes.size()));
return iban(randomCountryCode);
}
public String iban(String countryCode) {
String basicBankAccountNumber = faker.regexify(countryCodeToBasicBankAccountNumberPattern.get(countryCode));
String checkSum = calculateIbanChecksum(countryCode, basicBankAccountNumber);
return countryCode + checkSum + basicBankAccountNumber;
}
private CreditCardType randomCreditCardType() {
return CreditCardType.values()[this.faker.random().nextInt(CreditCardType.values().length)];
}
private static int sum(String[] string) {
int sum = 0;
for (String s : string) {
if (!s.isEmpty()) {
sum += Integer.valueOf(s);
}
}
return sum;
}
private static String calculateIbanChecksum(String countryCode, String basicBankAccountNumber) {
String basis = basicBankAccountNumber + countryCode + "00";
StringBuilder sb = new StringBuilder();
char[] characters = basis.toLowerCase().toCharArray();
for (char c : characters) {
if (Character.isLetter(c)) {
sb.append(String.valueOf((c - 'a') + 10));
} else {
sb.append(c);
}
}
int mod97 = new BigInteger(sb.toString()).mod(BigInteger.valueOf(97L)).intValue();
return StringUtils.leftPad(String.valueOf(98 - mod97), 2, '0');
}
private static Map createCountryCodeToBasicBankAccountNumberPatternMap() {
// source: https://www.swift.com/standards/data-standards/iban
Map ibanFormats = new HashMap();
ibanFormats.put("AL", "\\d{8}[0-9A-Za-z]{16}");
ibanFormats.put("AD", "\\d{4}\\d{4}[0-9A-Za-z]{12}");
ibanFormats.put("AT", "\\d{5}\\d{11}");
ibanFormats.put("AZ", "[A-Z]{4}[0-9A-Za-z]{20}");
ibanFormats.put("BH", "[A-Z]{4}[0-9A-Za-z]{14}");
ibanFormats.put("BE", "\\d{3}\\d{7}\\d{2}");
ibanFormats.put("BA", "\\d{3}\\d{3}\\d{8}\\d{2}");
ibanFormats.put("BR", "\\d{8}\\d{5}\\d{10}[A-Z]{1}[0-9A-Za-z]{1}");
ibanFormats.put("BG", "[A-Z]{4}\\d{4}\\d{2}[0-9A-Za-z]{8}");
ibanFormats.put("CR", "\\d{3}\\d{14}");
ibanFormats.put("HR", "\\d{7}\\d{10}");
ibanFormats.put("CY", "\\d{3}\\d{5}[0-9A-Za-z]{16}");
ibanFormats.put("DK", "\\d{4}\\d{9}\\d{1}");
ibanFormats.put("DO", "[0-9A-Za-z]{4}\\d{20}");
ibanFormats.put("EE", "\\d{2}\\d{2}\\d{11}\\d{1}");
ibanFormats.put("FI", "\\d{6}\\d{7}\\d{1}");
ibanFormats.put("FR", "\\d{5}\\d{5}[0-9A-Za-z]{11}\\d{2}");
ibanFormats.put("GE", "[A-Z]{2}\\d{16}");
ibanFormats.put("DE", "\\d{8}\\d{10}");
ibanFormats.put("GI", "[A-Z]{4}[0-9A-Za-z]{15}");
ibanFormats.put("GR", "\\d{3}\\d{4}[0-9A-Za-z]{16}");
ibanFormats.put("GT", "[0-9A-Za-z]{4}[0-9A-Za-z]{20}");
ibanFormats.put("HU", "\\d{3}\\d{4}\\d{1}\\d{15}\\d{1}");
ibanFormats.put("IS", "\\d{4}\\d{2}\\d{6}\\d{10}");
ibanFormats.put("IE", "[A-Z]{4}\\d{6}\\d{8}");
ibanFormats.put("IL", "\\d{3}\\d{3}\\d{13}");
ibanFormats.put("IT", "[A-Z]{1}\\d{5}\\d{5}[0-9A-Za-z]{12}");
ibanFormats.put("JO", "[A-Z]{4}\\d{4}[0-9A-Za-z]{18}");
ibanFormats.put("KZ", "\\d{3}[0-9A-Za-z]{13}");
ibanFormats.put("XK", "\\d{4}\\d{10}\\d{2}");
ibanFormats.put("KW", "[A-Z]{4}[0-9A-Za-z]{22}");
ibanFormats.put("LV", "[A-Z]{4}[0-9A-Za-z]{13}");
ibanFormats.put("LB", "\\d{4}[0-9A-Za-z]{20}");
ibanFormats.put("LI", "\\d{5}[0-9A-Za-z]{12}");
ibanFormats.put("LT", "\\d{5}\\d{11}");
ibanFormats.put("LU", "\\d{3}[0-9A-Za-z]{13}");
ibanFormats.put("MK", "\\d{3}[0-9A-Za-z]{10}\\d{2}");
ibanFormats.put("MT", "[A-Z]{4}\\d{5}[0-9A-Za-z]{18}");
ibanFormats.put("MR", "\\d{5}\\d{5}\\d{11}\\d{2}");
ibanFormats.put("MU", "[A-Z]{4}\\d{2}\\d{2}\\d{12}\\d{3}[A-Z]{3}");
ibanFormats.put("MD", "[0-9A-Za-z]{2}[0-9A-Za-z]{18}");
ibanFormats.put("MC", "\\d{5}\\d{5}[0-9A-Za-z]{11}\\d{2}");
ibanFormats.put("ME", "\\d{3}\\d{13}\\d{2}");
ibanFormats.put("NL", "[A-Z]{4}\\d{10}");
ibanFormats.put("NO", "\\d{4}\\d{6}\\d{1}");
ibanFormats.put("PK", "[A-Z]{4}[0-9A-Za-z]{16}");
ibanFormats.put("PS", "[A-Z]{4}[0-9A-Za-z]{21}");
ibanFormats.put("PL", "\\d{8}\\d{16}");
ibanFormats.put("PT", "\\d{4}\\d{4}\\d{11}\\d{2}");
ibanFormats.put("QA", "[A-Z]{4}[0-9A-Za-z]{21}");
ibanFormats.put("RO", "[A-Z]{4}[0-9A-Za-z]{16}");
ibanFormats.put("LC", "[A-Z]{4}[0-9A-Za-z]{24}");
ibanFormats.put("SM", "[A-Z]{1}\\d{5}\\d{5}[0-9A-Za-z]{12}");
ibanFormats.put("ST", "\\d{8}\\d{11}\\d{2}");
ibanFormats.put("SA", "\\d{2}[0-9A-Za-z]{18}");
ibanFormats.put("RS", "\\d{3}\\d{13}\\d{2}");
ibanFormats.put("SK", "\\d{4}\\d{6}\\d{10}");
ibanFormats.put("SI", "\\d{5}\\d{8}\\d{2}");
ibanFormats.put("ES", "\\d{4}\\d{4}\\d{1}\\d{1}\\d{10}");
ibanFormats.put("SE", "\\d{3}\\d{16}\\d{1}");
ibanFormats.put("CH", "\\d{5}[0-9A-Za-z]{12}");
ibanFormats.put("TL", "\\d{3}\\d{14}\\d{2}");
ibanFormats.put("TN", "\\d{2}\\d{3}\\d{13}\\d{2}");
ibanFormats.put("TR", "\\d{5}\\d{1}[0-9A-Za-z]{16}");
ibanFormats.put("UA", "\\d{6}[0-9A-Za-z]{19}");
ibanFormats.put("AE", "\\d{3}\\d{16}");
ibanFormats.put("GB", "[A-Z]{4}\\d{6}\\d{8}");
ibanFormats.put("VG", "[A-Z]{4}\\d{16}");
return ibanFormats;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy