How to mask a number with stars except the last 4 digits in Ruby

3 Answers

0 votes
def mask_number(value, mask_char = '*')
  str = value.to_s
  return str if str.length <= 4

  str[-4..].rjust(str.length, mask_char)
end

# Examples:
puts mask_number("1234567890123456") # ************3456
puts mask_number(9876543210)         # ******3210
puts mask_number("123")              # 123



# run:
#
# ***********3456
# ******3210
# 123
#

 



answered Oct 6 by avibootz
0 votes
def mask_number_explicit(value, mask_char = '*')
  str = value.to_s
  return str if str.length <= 4

  (mask_char * (str.length - 4)) + str[-4..]
end

puts mask_number_explicit("1234567890123456") # ************3456



# run:
#
# ************3456
#

 



answered Oct 6 by avibootz
0 votes
def mask_digits_keep_format(value, visible_digits = 4, mask_char = '*')
  str = value.to_s
  total_digits = str.scan(/\d/).count
  return str if total_digits <= visible_digits

  digits_to_mask = total_digits - visible_digits
  masked_count = 0

  str.gsub(/\d/) do |digit|
    if masked_count < digits_to_mask
      masked_count += 1
      mask_char
    else
      digit
    end
  end
end

# Examples:
puts mask_digits_keep_format("1234-5678-9012-3456") # ****-****-****-3456
puts mask_digits_keep_format("+1 (800) 555-0199")    # +* (***) ***-0199



# run:
#
# ****-****-****-3456
# +* (***) ***-0199
#

 



answered Oct 6 by avibootz
...