masque tous les chiffres sauf les 6 premiers et les 4 derniers chiffres d'une chaîne( de longueur variable )
J'ai un numéro de carte en tant que chaîne de caractères, par exemple:
string ClsCommon.str_CardNumbe r = "3456123434561234";
La longueur de ce numéro de la carte peut varier de 16 à 19 chiffres, selon l'exigence.
Mon exigence est que je dois montrer les six premiers chiffres et les 4 derniers chiffres d'un numéro de carte et masque les autres personnages entre les deux, avec le caractère 'X'.
J'ai essayé d'utiliser subString et mis en œuvre séparément pour 16,17,18,19 chiffres..
Je scinde une chaîne(ClsCommon.str_CardNumber) à 5 cordes (str_cardNum1, str_cardNum2, str_cardNum3, str_cardNum4, str_cardNum5 - 4 chiffres pour chaque chaîne..chiffres restants pour la 5e chaîne)
Toutes les chaînes sont placées dans ClsCommon fichier.
Basé sur que j'ai mis en place ci-dessous, qui fonctionne parfaitement:
if (ClsCommon.str_CardNumber.Length == 16) {
txtmskcrdnum.Text = string.Concat(ClsCommon.str_cardNum1, " ", ClsCommon.str_cardNum2.Substring(0, 2), "XX", " ", "XXXX", " ", ClsCommon.str_cardNum4);
}
if (ClsCommon.str_CardNumber.Length == 17) {
txtmskcrdnum.Text = string.Concat(ClsCommon.str_cardNum1, " ", ClsCommon.str_cardNum2.Substring(0, 2), "XX", " ", "XXXX", " ", "X", ClsCommon.str_cardNum4.Substring(1, 3), " ", ClsCommon.str_cardNum5);
}
if (ClsCommon.str_CardNumber.Length == 18) {
txtmskcrdnum.Text = string.Concat(ClsCommon.str_cardNum1, " ", ClsCommon.str_cardNum2.Substring(0, 2), "XX", " ", "XXXX", " ", "XX", ClsCommon.str_cardNum4.Substring(2, 2), " ", ClsCommon.str_cardNum5);
}
if (ClsCommon.str_CardNumber.Length == 19) {
txtmskcrdnum.Text = string.Concat(ClsCommon.str_cardNum1, " ", ClsCommon.str_cardNum2.Substring(0, 2), "XX", " ", "XXXX", " ", "XXX", ClsCommon.str_cardNum4.Substring(3, 1), " ", ClsCommon.str_cardNum5);
}
txtmskcrdnum.Text = ClsCommon.str_CardNumber.PadLeft(ClsCommon.str_CardNumber.Length, 'X').Substring(ClsCommon.str_CardNumber.Length - 4);
Pour plusieurs longueurs, l'approche ci-dessus n'est pas utile.
Je veux une approche unique qui affiche les 6 premiers et les 4 derniers chiffres et des masques d'autres chiffres avec X.
Le final de la chaîne doit avoir un espace entre chaque groupe de 4 chiffres.
OriginalL'auteur Kartiikeya Baleneni | 2015-06-23
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne avec n'importe quel numéro de carte de longueur:
si le premier nombre est donné par des espaces (ou d'autres diviseurs), par exemple
var cardNumber = "3456 1234 3456 1234";
le résultat final sera de incorrect3456 1XX XXXX XXX1 234
; l'autre problème, c'est que généralement nous voulons préserver le format donné (par exemple,3456-1234-3456-1234
) et que masquer les chiffres (3456-12XX-XXXX-1234
).d'accord, mais c'est en dehors de la portée de la question. Nous avons tendance à supprimer complètement tous les non-chiffres, de caractères, de valider le numéro de la carte via Luhn et Bin vérifications, puis recracher masqués et parfois, formaté.
Je suis d'accord avec yannick réponse. Enlève tous les caractères spéciaux, masque les chiffres, puis de le re-formater le nombre avec des tirets ou des espaces. Votre vient de rendre la vie difficile en essayant de conserver la mise en forme tout le chemin à travers.
OriginalL'auteur
Je voudrais faire quelque chose comme ceci (pseudo C# - prendre comme idée de construire).
Code non testé à l'avance...
OriginalL'auteur
Essayer celui-ci. Simple et direct.
OriginalL'auteur
Possibles de mise en œuvre (acccepts varios formats par exemple, les nombres peuvent être divisés en groupes, etc.):
cette mise en œuvre uniquement pour masquer les chiffres et préserver le format.
OriginalL'auteur
Une méthode:
masked += (i >= 6...
(afin de préserver l'6 symboles, et non pas 7)doit avoir été 5 en fait!
OriginalL'auteur
Je suis sûr qu'il ya une façon plus propre de le faire:
Désolé, j'ai corrigé 🙂
Après la lecture de @Yannicks réponse, id aller avec sa méthode. Je ne savais pas qu'on pouvait créer une chaîne comme ça 🙂
OriginalL'auteur
Comment sur le remplacement d'un spécifique groupe apparié à l'aide de Regex :
OriginalL'auteur
Beaucoup de solutions d'analyse l'entrée en plusieurs fois.
Ci-dessous, je présente une solution qui analyse les saisies qu'une seule fois.
Mais je n'ai pas d'expérience en C#, donc la fonction est écrite dans le Schéma.
La fonction est divisé en deux:
(1) visite de la première 6 analyse les six premiers caractères et les concatène pour le reste du calcul.
Lors de la visite de la première 6 a analysé les six premiers caractères, il appelle à la visite de repos.
(2) visite de repos exploite le fait que nous pouvons retarder de calcul, jusqu'à ce que nous avons acquis plus de connaissances.
Dans ce cas, nous nous attendre pour déterminer si l'élément de la liste doit être affichée jusqu'à ce que nous savons combien de personnages sont à gauche.
L'exécution de masque dans la Petite Chez interpréteur Scheme
NB. Je l'ai vu comme un drôle d'exercice et j'ai pensé que je pourrais aussi bien le partager.
Yannick Meeus a déjà fourni une facilement compréhensible solution.
Donc, cela ne sert que pour les intéressés.
OriginalL'auteur
Linq enregistre lignes de code, petit extrait de code.
Remplace par (*) char 6 ci-dessus et ci-dessous CardPan longueur de moins de 4
OriginalL'auteur