mask

fun mask(value: String, visibleStart: Int = 0, visibleEnd: Int = 4, maskChar: Char = 'X'): String(source)

Masks an IMEI number for PII-safe display.

IMEI is Device PII — it uniquely identifies a physical device (Telecom Cybersecurity Rules, 2024). Always mask before displaying in UI or writing to logs.

Masking operates on the raw input string (not normalised). This is intentional — the masker is a display utility working character-by-character on whatever it receives. Callers who want to mask a normalised 15-digit IMEI should call format first: IMEI.mask(IMEI.format(value)).

Note on raw vs normalised masking: IMEI.mask("490 154 203 237 518") masks a 19-character string char-by-char — spaces in the raw input are also masked. If caller wants to mask a clean 15-digit string, call IMEI.format(value) first, then IMEI.mask(...).

Default (visibleStart=0, visibleEnd=4, maskChar='X'): Shows last 4 characters of the raw input, masks the rest. "490154203237518""XXXXXXXXXXX7518" (11 X's + last 4 digits)

Edge cases (all safe — never throws):

  • Empty input → returns "".

  • visibleStart + visibleEnd >= value.length → entire string returned unmasked (overlap rule).

  • Non-normalised input → masking applied character-by-character on the raw string.

Return

Masked string. Never throws — display-safe by contract.

Parameters

value

Raw IMEI string to mask. No normalisation is applied.

visibleStart

Number of leading characters to show unmasked. Default: 0.

visibleEnd

Number of trailing characters to show unmasked. Default: 4.

maskChar

Character to replace masked positions. Default: 'X'.

Samples

check(IMEI.mask("356938035643809") == "XXXXXXXXXXX3809")