文字列の文字を「最後の数字を除く」という条件に置き換えるにはどうすればよいですか?
例:
string = "4111111111111111";
そして私はそれを作りたい
new_string = "XXXXXXXXXXXXX1111"
この例では、最後の4文字を除いて、文字を「X」に置き換えます。
どうすればこれを達成できますか?
それはあなたに合いますか?
var input = "4111111111111111";
var length = input.Length;
var result = new String('X', length - 4) + input.Substring(length - 4);
Console.WriteLine(result);
// Ouput: XXXXXXXXXXXX1111
のようなものはどうですか...
new_string = new String('X', YourString.Length - 4)
+ YourString.Substring(YourString.Length - 4);
現在の文字列-4の長さに基づいて新しい文字列を作成し、すべて「X」にします。次に、元の文字列の最後の4文字を追加します
これがそれを考える方法です。残す最後の番号の文字を呼び出します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);
これはあなたの質問には少しやり過ぎかもしれません。しかし、これを行う簡単な拡張方法があります。
デフォルトではマスキング文字として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);
}
}
}
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();
ここでの他の簡潔な答えのいくつかは、n文字未満の文字列を考慮していませんでした。これが私の見解です:
var length = input.Length;
input = length > 4 ? new String('*', length - 4) + input.Substring(length - 4) : input;
ルイ、これを試してみてください...
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;
}
あなたを助けるかもしれません...
Select
インデックスで使えると思います
string input = "4111111111111111";
string new_string = new string(input.Select((c, i) => i < input.Length - 4 ? 'X' : c).ToArray());
これを試して:
String maskedString = "...."+ (testString.substring(testString.length() - 4, testString.length()));
パーティーに遅れましたが、最後の「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();
}