17

文字列の文字を「最後の数字を除く」という条件に置き換えるにはどうすればよいですか?

例:

string = "4111111111111111";

そして私はそれを作りたい

new_string = "XXXXXXXXXXXXX1111"

この例では、最後の4文字を除いて、文字を「X」に置き換えます。

どうすればこれを達成できますか?

4

10 に答える 10

26

それはあなたに合いますか?

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

Console.WriteLine(result);

// Ouput: XXXXXXXXXXXX1111
于 2013-03-07T03:02:42.490 に答える
12

のようなものはどうですか...

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

現在の文字列-4の長さに基づいて新しい文字列を作成し、すべて「X」にします。次に、元の文字列の最後の4文字を追加します

于 2013-03-07T03:05:10.880 に答える
9

これがそれを考える方法です。残す最後の番号の文字を呼び出しますn

  1. 何文字が置き換えられXますか?文字列の長さから。を引いたものn
  2. どうすれば文字を他の文字に置き換えることができますか?を直接変更することはできませんstringが、新しいものを作成することはできます。
  3. 元の文字列から最後の文字を取得するにはどうすればよい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);
于 2013-03-07T03:04:01.780 に答える
3

これはあなたの質問には少しやり過ぎかもしれません。しかし、これを行う簡単な拡張方法があります。

デフォルトではマスキング文字としてxを使用しますが、オプションの文字で変更できます

   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);
        }
    }
}
于 2019-06-13T16:53:37.403 に答える
2
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();
于 2013-03-07T03:04:49.033 に答える
2

ここでの他の簡潔な答えのいくつかは、n文字未満の文字列を考慮していませんでした。これが私の見解です:

 var length = input.Length;                
 input = length > 4 ? new String('*', length - 4) + input.Substring(length - 4) : input;
于 2019-09-13T17:45:00.207 に答える
1

ルイ、これを試してみてください...

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

元の文字列を渡し、数字を含まない1つの関数を作成します。

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

あなたを助けるかもしれません...

于 2013-03-07T04:12:50.367 に答える
1

Selectインデックスで使えると思います

string input = "4111111111111111";
string new_string = new string(input.Select((c, i) => i < input.Length - 4 ? 'X' : c).ToArray());
于 2013-03-07T03:06:09.570 に答える
0

これを試して:

String maskedString = "...."+ (testString.substring(testString.length() - 4, testString.length()));
于 2018-08-23T22:04:14.160 に答える
0

パーティーに遅れましたが、最後の「x」文字を除くすべてをマスクしたかったのですが、数字または文字のみをマスクして、-()、その他のフォーマットなどが引き続き表示されるようにしました。これを行う私のクイック拡張方法は次のとおりです-うまくいけば、それは誰かを助けます。Luke Hammerの例から始めて、ニーズに合わせて内臓を変更しました。

public static string MaskOnlyChars(this string input, int charsToDisplay, char maskingChar = 'x')
    {
        StringBuilder sbOutput = new StringBuilder();
        int intMaskCount = input.Length - charsToDisplay;

        if (intMaskCount > 0) //only mask if string is longer than requested unmasked chars
        {
            for (var intloop = 0; intloop < input.Length; intloop++)
            {
                char charCurr = Char.Parse(input.Substring(intloop, 1));
                byte[] charByte = Encoding.ASCII.GetBytes(charCurr.ToString());
                int intCurrAscii = charByte[0];

                if (intloop <= (intMaskCount - 1))
                {
                    switch (intCurrAscii)
                    {
                        case int n when (n >= 48 && n <= 57):
                            //0-9
                            sbOutput.Append(maskingChar);
                            break;

                        case int n when (n >= 65 && n <= 90):
                            //A-Z
                            sbOutput.Append(maskingChar);
                            break;

                        case int n when (n >= 97 && n <= 122):
                            //a-z
                            sbOutput.Append(maskingChar);
                            break;

                        default:
                            //Leave other characters unmasked
                            sbOutput.Append(charCurr);
                            break;
                    }
                }
                else
                {
                    //Characters at end to remain unmasked
                    sbOutput.Append(charCurr);
                }
            }
        }
        else
        {
            //if not enough characters to mask, show unaltered input
            return input;
        }
        return sbOutput.ToString();
    }
于 2020-10-06T21:14:56.547 に答える