redactPhone method

  1. @useResult
String redactPhone({
  1. int visibleCount = 4,
  2. String maskChar = '*',
})

Redacts a phone-like string: keeps last visibleCount digits, masks the rest with maskChar.

Only digit characters are considered for visibility; non-digits are preserved in place. If there are no digits, returns maskChar repeated for each character.

Throws ArgumentError if maskChar is empty or visibleCount is negative.

Example:

'+1 (555) 123-4567'.redactPhone(visibleCount: 4); // '+* (**) ***-4567' (digits masked except last 4)

Implementation

@useResult
String redactPhone({
  int visibleCount = 4,
  String maskChar = '*',
}) {
  if (maskChar.isEmpty) {
    throw ArgumentError(_kErrMaskCharNonEmpty, _kParamMaskChar);
  }
  if (visibleCount < 0) {
    throw ArgumentError(_kErrVisibleCountNonNegative, _kParamVisibleCount);
  }
  if (isEmpty) return this;
  final List<int> digitIndices = <int>[];
  for (final MapEntry<int, String> entry in split('').asMap().entries) {
    if (RegExp(r'\d').hasMatch(entry.value)) digitIndices.add(entry.key);
  }
  if (digitIndices.length <= visibleCount) return this;
  final int maskFrom = digitIndices.length - visibleCount;
  final List<String> chars = split('');
  for (final int idx in digitIndices.take(maskFrom)) {
    chars[idx] = maskChar;
  }
  return chars.join();
}