Маскировка всех символов строки, за исключением последних n символов

Я хочу знать, как заменить символ строки условием "кроме последних номеров символов"?

Пример:

string = "4111111111111111";

И я хочу сделать это, чтобы

new_string = "XXXXXXXXXXXXX1111"

В этом примере я заменяю символ на "X", за исключением последних 4 символов.

Как я могу это достичь?

Ответ 1

Вот способ продумать это. Вызовите последние цифры номера, чтобы оставить n:

  • Сколько символов будет заменено на X? Длина строки минус n.
  • Как мы можем заменить символы другими символами? Вы не можете напрямую изменить string, но можете создать новый.
  • Как получить последние n символы из исходной строки? Там есть несколько способов сделать это, но наиболее простым является Substring, что позволяет нам захватить часть строки, указав начальную точку и, необязательно, конечную точку.

Таким образом, он будет выглядеть примерно так (где n - количество символов, которые должны покинуть оригинал, а str - это исходная строка - string не может быть именем вашей переменной, потому что это зарезервированное ключевое слово):

// 2. Start with a blank string
var new_string = "";

// 1. Replace first Length - n characters with X
for (var i = 0; i < str.Length - n; i++)
    new_string += "X";

// 3. Add in the last n characters from original string.
new_string += str.Substring(str.Length - n);

Ответ 2

Это вам подходит?

var input = "4111111111111111";
var length = input.Length;
var result = new String('X', length - 4) + input.Substring(length - 4);

Console.WriteLine(result);

// Ouput: XXXXXXXXXXXX1111

Ответ 3

Как насчет чего-то вроде...

new_string = new String('X', YourString.Length - 4)
                  + YourString.Substring(YourString.Length - 4);

создайте новую строку, основанную на длине текущей строки -4, и просто получите все "X". Затем добавьте последние 4 символа исходной строки

Ответ 4

StringBuilder sb  = new StringBuilder();
Char[] stringChar = string.toCharArray();
for(int x = 0; x < stringChar.length-4; x++){
    sb.append(stringChar[x]);
}
sb.append(string.substring(string.length()-4));

string = sb.toString();

Ответ 5

Я думаю, вы могли бы использовать Select с индексом

string input = "4111111111111111";
string new_string = new string(input.Select((c, i) => i < input.Length - 4 ? 'X' : c).ToArray());

Ответ 6

луй, Пожалуйста, попробуйте этот...

string dispString = DisplayString("4111111111111111", 4);

Создать одну функцию с исходной строкой прохода и без цифры.

    public string DisplayString(string strOriginal,int lastDigit)
    {
        string strResult = new String('X', strOriginal.Length - lastDigit) + strOriginal.Substring(strOriginal.Length - lastDigit);
        return strResult;
    }

Может помочь вам....

Ответ 7

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

String maskedString = "...."+ (testString.substring(testString.length() - 4, testString.length()));

Ответ 8

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

по умолчанию используется x в качестве маскирующего Char, но его можно изменить с помощью дополнительного символа

   public static class Masking
{
    public static string MaskAllButLast(this string input, int charsToDisplay, char maskingChar = 'x')
    {
        int charsToMask = input.Length - charsToDisplay;
        return charsToMask > 0 ? $"{new string(maskingChar, charsToMask)}{input.Substring(charsToMask)}" : input;
    }
}

Здесь модульные тесты, чтобы доказать, что это работает

 using Xunit;

    namespace Tests
{
    public class MaskingTest
    {
        [Theory]
        [InlineData("ThisIsATest", 4, 'x', "xxxxxxxTest")]
        [InlineData("Test", 4, null, "Test")]
        [InlineData("ThisIsATest", 4, '*', "*******Test")]
        [InlineData("Test", 16, 'x', "Test")]
        [InlineData("Test", 0, 'y', "yyyy")]
        public void Testing_Masking(string input, int charToDisplay, char maskingChar, string expected)
        {
            //Act
            string actual = input.MaskAllButLast(charToDisplay, maskingChar);

            //Assert
            Assert.Equal(expected, actual);
        }
    }
}