Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как скрыть часть строки звёздочками

Короткий ответ

Оставьте видимыми последние символы, а остальные замените звёздочками через repeat():

void main() {
    String card = "4000123456789010";
    String masked = "*".repeat(card.length() - 4) + card.substring(card.length() - 4);
 
    IO.println(masked);
}

Результат:

************9010

Универсальный метод

Метод с параметрами «сколько оставить в начале и в конце»:

String mask(String text, int keepStart, int keepEnd) {
    if (text.length() <= keepStart + keepEnd) {
        return text;
    }
    int hidden = text.length() - keepStart - keepEnd;
    return text.substring(0, keepStart) + "*".repeat(hidden) + text.substring(text.length() - keepEnd);
}
 
void main() {
    IO.println(mask("+49 151 2345 6789", 3, 4));
    IO.println(mask("abc", 2, 2));
}

Результат:

+49**********6789
abc

Email

В адресе почты обычно скрывают середину имени до @:

void main() {
    String email = "anna.smith@example.com";
    int at = email.indexOf('@');
    String name = email.substring(0, at);
 
    IO.println(name.charAt(0) + "*".repeat(name.length() - 2) + name.charAt(name.length() - 1) + email.substring(at));
}

Результат:

a********h@example.com

Частая ошибка

Не проверить длину. Если строка короче, чем количество видимых символов, repeat() получит отрицательное число:

void main() {
    String code = "12";
    IO.println("*".repeat(code.length() - 4) + code);
}

Результат:

Exception in thread "main" java.lang.IllegalArgumentException: count is negative: -2

Функции из этого ответа

  • String.repeat() — Повторяет строку указанное число раз.
  • String.substring() — Возвращает часть строки между двумя индексами.
  • String.length() — Возвращает количество символов в строке.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.