Masquer les 12 premiers caractères de la chaîne avec *?
Comment puis-je prendre la valeur 123456789012345
ou 1234567890123456
et la transformer en:
************2345
et ************3456
La différence entre les chaînes ci-dessus est que l'une contient 15 chiffres et l'autre 16.
J'ai essayé ce qui suit, mais il ne conserve pas les 4 derniers chiffres du numéro à 15 chiffres et quelle que soit la longueur de la chaîne, qu'il s'agisse de 13, 14, 15 ou 16, je souhaite masquer tous les chiffres du début avec un *, mais gardez les 4 derniers. Voici ce que j'ai essayé:
String.Format("{0}{1}", "************", str.Substring(11, str.Length - 12))
using System;
class Program
{
static void Main()
{
var str = "1234567890123456";
if (str.Length > 4)
{
Console.WriteLine(
string.Concat(
"".PadLeft(12, '*'),
str.Substring(str.Length - 4)
)
);
}
else
{
Console.WriteLine(str);
}
}
}
Quelque chose comme ça:
string s = "1234567890123"; // example
string result = s.Substring(s.Length - 4).PadLeft(s.Length, '*');
Cela masquera tous les caractères sauf les quatre derniers de la chaîne. Cela suppose que la chaîne source comporte au moins 4 caractères.
Méthode la plus simple: créez une méthode d'extension pour extraire les quatre derniers chiffres. Utilisez cela dans votre appel String.Format.
Par exemple:
public static string LastFour(this string value)
{
if (string.IsNullOrEmpty(value) || value.length < 4)
{
return "0000";
}
return value.Substring(value.Length - 4, 4)
}
Dans votre code:
String.Format("{0}{1}", "************", str.LastFour());
À mon avis, cela conduit à un code plus lisible et réutilisable.
EDIT: Peut-être pas le moyen le plus simple, mais un moyen alternatif qui peut produire des résultats plus faciles à maintenir. <haussement d'épaules />
Essaye ça:
var maskSize = ccDigits.Length - 4;
var mask = new string('*', maskSize) + ccDigits.Substring(maskSize);
LINQ:
char maskBy = '*';
string input = "123456789012345";
int count = input.Length <= 4 ? 0 : input.Length - 4;
string output = new string(input.Select((c, i) => i < count ? maskBy : c).ToArray());
private string MaskDigits(string input)
{
//take first 6 characters
string firstPart = input.Substring(0, 6);
//take last 4 characters
int len = input.Length;
string lastPart = input.Substring(len - 4, 4);
//take the middle part (****)
int middlePartLenght = len - (firstPart.Length + lastPart.Length);
string middlePart = new String('*', middlePartLenght);
return firstPart + middlePart + lastPart;
}
MaskDigits("1234567890123456");
// output : "123456******3456"
Essayez ce qui suit:
private string MaskString(string s)
{
int NUM_ASTERISKS = 4;
if (s.Length < NUM_ASTERISKS) return s;
int asterisks = s.Length - NUM_ASTERISKS;
string result = new string('*', asterisks);
result += s.Substring(s.Length - NUM_ASTERISKS);
return result;
}
static private String MaskInput(String input, int charactersToShowAtEnd)
{
if (input.Length < charactersToShowAtEnd)
{
charactersToShowAtEnd = input.Length;
}
String endCharacters = input.Substring(input.Length - charactersToShowAtEnd);
return String.Format(
"{0}{1}",
"".PadLeft(input.Length - charactersToShowAtEnd, '*'),
endCharacters
);
}
Ajustez l'en-tête de la fonction selon vos besoins, appelez avec:
MaskInput("yourInputHere", 4);
Regex avec un évaluateur de match fera le travail
string filterCC(string source) {
var x=new Regex(@"^\d+(?=\d{4}$)");
return x.Replace(source,match => new String('*',match.Value.Length));
}
Cela correspondra à un nombre quelconque de chiffres suivi de 4 chiffres et de la fin (les 4 chiffres ne seront pas inclus dans le remplacement). La fonction replace remplacera la correspondance par une chaîne de * de longueur égale.
Cela présente l'avantage supplémentaire que vous pouvez également l'utiliser comme outil de validation. Remplacez le premier + par {11,12} pour qu'il corresponde à 15 ou 16 caractères, puis vous pourrez utiliser x.IsMatch
pour en déterminer la validité.
MODIFIER
Alternativement, si vous voulez toujours un résultat de 16 caractères, utilisez simplement
return x.Replace(source,new String('*',12));
// "123456789".MaskFront results in "****56789"
public static string MaskFront(this string str, int len, char c)
{
var strArray = str.ToCharArray();
for (var i = 0; i < len; i++)
{
if(i < strArray.Length)
{
strArray[i] = c;
}
else
{
break;
}
}
return string.Join("", strArray);
}
// "123456789".MaskBack results in "12345****"
public static string MaskBack(this string str, int len, char c)
{
var strArray = str.ToCharArray();
var tracker = strArray.Length - 1;
for (var i = 0; i < len; i++)
{
if (tracker > -1)
{
strArray[tracker] = c;
tracker--;
}
else
{
break;
}
}
return string.Join("", strArray);
}
Essayez ceci:
static string Mask(string str)
{
if (str.Length <= 4) return str;
Regex rgx = new Regex(@"(.*?)(\d{4})$");
string result = String.Empty;
if (rgx.IsMatch(str))
{
for (int i = 0; i < rgx.Matches(str)[0].Groups[1].Length; i++)
result += "*";
result += rgx.Matches(str)[0].Groups[2];
return result;
}
return str;
}
Un moyen simple
string s = "1234567890123"; // example
int l = s.Length;
s = s.Substring(l - 4);
string r = new string('*', l);
r = r + s;