redactPhone method
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();
}