2015-03-28 10 views
5

Given ciąg, który reprezentuje numer karty kredytowej ...Scala: Jak zamaskować pierwsze znaki n ciąg

val creditCardNo = "1111222233334444" 

... w jaki sposób maskować pierwszych 12 znaków z *?

val maskedCreditCardNo = "************4444" 
+2

To wstyd, że som-snytt nie odpowiedział na swój "poprawny" komentarz, ponieważ jest to rozwiązanie o wiele bardziej idiomatyczne niż zwykłe wyrażenie (które nawet nie rozwiązuje problemu podanego w tytule). –

Odpowiedz

6

Wymień wszystkie symbole cyfrowe, chyba 4 znaków pozostają:

creditCardNo.replaceAll("\\d(?=\\d{4})", "*") 
14

Wystarczy użyć drop lub substring na oryginalnym numerem, a poprzedzić odpowiednią liczbę "*":

"*" * 12 + (creditCardNo drop 12) 
+10

Idiomatycznie, 'ns.patch (0," * "* 12, 12)'. –

1

Podejście, w którym można modyfikować wartości znaków dla każdej pozycji, w tym przypadku przed pozycją 12,

creditCardNo.zipWithIndex.map (c => if (c._2 < 12) '*' else c._1).mkString 

Należy pamiętać, że pomimo możliwości indywidualnej zmiany każdej pozycji, nie jest to najbardziej efektywny sposób manipulowania ciągami.

Powiązane problemy