-2

I use this java code to mark a long number:

public static String masked(String card_number) {
        return new StringBuilder().append(card_number.substring(0, 4)).append("....")
                .append(card_number.substring(card_number.length() - 3, card_number.length())).toString();
    }

    public static String maskedBin(String card_number) {
        return new StringBuilder().append(card_number.substring(0, 4)).toString();
    }

    public static String maskedTail(String card_number) {
        return new StringBuilder().append(card_number.substring(card_number.length() - 3, card_number.length())).toString();
    }

Unfortunately when I send very short number I get exception: java.lang.StringIndexOutOfBoundsException: begin 0, end 4, length 1

Is there some way to prevent this? For example if there is no minimum required number length to return error?

Peter Penzov
  • 1,126
  • 134
  • 430
  • 808
  • 1
    Why do you think `return new StringBuilder().append(card_number.substring(0, 4)).toString();` is better than `card_number.substring(0, 4)` anyway? – Andy Turner May 17 '19 at 12:22
  • Just make sure the card_number has at least 8 characters BEFORE you pass it to the masking functions. – Adder May 17 '19 at 12:26
  • java.lang.StringIndexOutOfBoundsException ocuurs only when you try to access the string within its limit range, Check the length of string before doing the substring operation on that. – Manjunath H M May 17 '19 at 12:27
  • Btw you can use `.append(card_number, 0, 4)` no need for substring – Lino May 17 '19 at 12:27

2 Answers2

2

I added checks for a minimum length. Card numbers with a lower length will be completely masked, i.e. 1234567 => XXXXXXX. I chose the length limit so that at least one character gets masked. The string repeat function is copied from string repeat.

public static String masked(String card_number) {
    if(card_number.length() < 9){
        return maskedAll(card_number);
    }

    return new StringBuilder().append(card_number.substring(0, 4)).append("....")
            .append(card_number.substring(card_number.length() - 3, card_number.length())).toString();
}

public static String maskedBin(String card_number) {
    if(card_number.length() < 5){
        return maskedAll(card_number);
    }

    return new StringBuilder().append(card_number.substring(0, 4)).toString();
}

public static String maskedTail(String card_number) {
    if(card_number.length() < 5){
        return maskedAll(card_number);
    }

    return new StringBuilder().append(card_number.substring(card_number.length() - 3, card_number.length())).toString();
}

public static String maskedAll(String card_number) {
    return String.join("", Collections.nCopies(card_number.length(), "X"));
}
Adder
  • 5,708
  • 1
  • 28
  • 56
0

You wrote append(card_number.substring(0, 4)) here you used 4 value as hard coded if the card_number length is less than 4 value then it will give you error. So instead of hard coded value 4 use this card_number.length(). Or if you want hard coded value 4 anyway so first check if(card_number.length() > 4).

mate00
  • 2,727
  • 5
  • 26
  • 34