Маскировать часть первых 12 символов строки с помощью *? - PullRequest
13 голосов
/ 27 января 2012

Как мне взять значение 123456789012345 или 1234567890123456 и превратить его в:

************2345 и ************3456

Разница между строками выше в том, что одна содержит 15 цифр, а другая - 16.

Я пробовал следующее, но оно не сохраняет последние 4 цифры 15-значного числа, и теперь важно, какая длина строки, будь то 13, 14, 15 или 16, я хочу замаскировать все начало цифры с *, но оставьте последние 4. Вот что я пробовал:

String.Format("{0}{1}", "************", str.Substring(11, str.Length - 12))

Ответы [ 12 ]

28 голосов
/ 27 января 2012

Примерно так:

string s = "1234567890123"; // example
string result = s.Substring(s.Length - 4).PadLeft(s.Length, '*');

Это замаскирует все, кроме последних четырех символов строки.Предполагается, что длина исходной строки не менее 4 символов.

17 голосов
/ 27 января 2012
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);
        }
    }
}
14 голосов
/ 27 января 2012

Самый простой способ: создать метод расширения для извлечения последних четырех цифр. Используйте это в своем вызове String.Format.

Например:

public static string LastFour(this string value)
{
    if (string.IsNullOrEmpty(value) || value.length < 4)
    {
        return "0000";
    }
    return value.Substring(value.Length - 4, 4) 
}

В вашем коде:

String.Format("{0}{1}", "************", str.LastFour());

На мой взгляд, это приводит к более читаемому коду, и его можно использовать повторно.

РЕДАКТИРОВАТЬ: Возможно, не самый простой способ, но альтернативный способ, который может привести к более приемлемым результатам. <Пожимание плечами />

5 голосов
/ 27 января 2012

Попробуйте это:

var maskSize = ccDigits.Length - 4;
var mask = new string('*', maskSize) + ccDigits.Substring(maskSize);
3 голосов
/ 27 января 2012

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()); 
2 голосов
/ 02 мая 2017
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"
2 голосов
/ 27 января 2012
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
    );
}

Настройте заголовок функции, как требуется, вызовите с помощью:

MaskInput("yourInputHere", 4);
2 голосов
/ 27 января 2012

Попробуйте следующее:

    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;
    }
1 голос
/ 27 января 2012

Regex с оценщиком совпадений выполнит работу

string filterCC(string source) {
  var x=new Regex(@"^\d+(?=\d{4}$)");
  return x.Replace(source,match => new String('*',match.Value.Length));
}

Это будет соответствовать любому количеству цифр, за которыми следуют 4 цифры и конец (это не будет включать 4 цифры в замене).Функция замены заменит совпадение строкой * равной длины.

Это дает дополнительное преимущество, заключающееся в том, что вы также можете использовать его как algorthim для проверки.Измените первый + на {11,12}, чтобы он соответствовал в общей сложности 15 или 16 символам, а затем вы можете использовать x.IsMatch для определения действительности.

РЕДАКТИРОВАТЬ

В качестве альтернативы, если вы всегдахотите получить 16 символов, просто используйте

 return x.Replace(source,new String('*',12));
0 голосов
/ 24 октября 2018
// "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);
}
...