![](/img/trans.png)
[英]How can i make password encryption in which there should be no special characters just alpha-numeric characters
[英]How do I insert characters into an alpha-numeric string
我是C#的新手。 我有一個簡短的形式和一個長形式的客戶代碼。 短格式是一些字母字符和一些數字字符(ABC12),而長格式始終是15個字符長,字母和數字部分之間的空格用零填充(ABC000000000012)。 我需要能夠從短格式轉換為長格式。 下面的代碼是我如何使其工作的-這是最好的方法嗎?
public string ExpandCode(string s)
{
// s = "ABC12"
int i = 0;
char c;
bool foundDigit = false;
string o = null;
while (foundDigit == false)
{
c = Convert.ToChar(s.Substring(i, 1));
if (Char.IsDigit(c))
{
foundDigit = true;
o = s.Substring(0, i) + new String('0', 15-s.Length) + s.Substring(i,s.Length-i);
}
i += 1;
}
return (o); //o = "ABC000000000012"
}
您的代碼基本上是正確的,但是可能會很慢,因為String.Substring(...)
每次調用都會創建一個新字符串。
我還建議您使用.NET api的內置函數來完成您的任務,這可以使編碼更加容易:
private char[] numbers = new char[]{'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'};
public string ExpandCode(string s)
{
//Find the first numeric char.
int index = s.IndexOfAny(numbers);
//Insert zeros and return the result.
return s.Insert(index, new String('0', 15 - s.Length));
}
看看這個:
public string ExpandCode(string s)
{
var builder = new StringBuilder(s);
var index = Array.FindIndex(s.ToArray(), x => char.IsDigit(x));
while (builder.Length < 15)
{
builder.Insert(index, '0');
}
return builder.ToString();
}
我假設字符串始終是字母->數字(例如“ abc123”或“ ab1234”)。
越純正,越快
public static string ExpandCode4(string s)
{
char[] res = new char[15];
int ind = 0;
for (int i = 0; i < s.Length && s[i] >= 'A'; i++)
res[ind++] = s[i];
int tillDigit = ind;
for (int i = 0; i < 15 - s.Length; i++)
res[ind++] = '0';
for (int i = 0; i < s.Length - tillDigit; i++)
res[ind++] = s[tillDigit + i];
return new string(res);
}
所有答案的基准如下:
internal class Program
{
private static void Main(string[] args)
{
var inputs = new List<string>();
for (int i = 0; i < 10000000; i++)
{
inputs.Add("ABC1234");
}
var n1 = DateTime.Now;
inputs.ForEach(i => ExpandCode1(i));
var r1 = (DateTime.Now - n1).Ticks;
var n2 = DateTime.Now;
inputs.ForEach(i => ExpandCode2(i));
var r2 = (DateTime.Now - n2).Ticks;
var n3 = DateTime.Now;
inputs.ForEach(i => ExpandCode3(i));
var r3 = (DateTime.Now - n3).Ticks;
var n4 = DateTime.Now;
inputs.ForEach(i => ExpandCode4(i));
var r4 = (DateTime.Now - n4).Ticks;
var results = new List<Result>()
{
new Result() {Name = "1", Ticks = r1},
new Result() {Name = "2", Ticks = r2},
new Result() {Name = "3", Ticks = r3},
new Result() {Name = "4", Ticks = r4}
};
results.OrderBy(r => r.Ticks).ToList().ForEach(Console.WriteLine);
Console.ReadKey();
}
public static string ExpandCode4(string s)
{
char[] res = new char[15];
int ind = 0;
for (int i = 0; i < s.Length && s[i] >= 'A'; i++)
res[ind++] = s[i];
int tillDigit = ind;
for (int i = 0; i < 15 - s.Length; i++)
res[ind++] = '0';
for (int i = 0; i < s.Length - tillDigit; i++)
res[ind++] = s[tillDigit + i];
return new string(res);
}
public static string ExpandCode1(string s)
{
char[] numbers = new char[] { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' };
//Find the first numeric char.
int index = s.IndexOfAny(numbers);
//Insert zeros and return the result.
return s.Insert(index, new String('0', 15 - s.Length));
}
public static string ExpandCode2(string s)
{
var builder = new StringBuilder(s);
var index = Array.FindIndex(s.ToArray(), x => char.IsDigit(x));
while (builder.Length < 15)
{
builder.Insert(index, '0');
}
return builder.ToString();
}
public static string ExpandCode3(string s)
{
var match = Regex.Match(s, @"([^\d]+)(\d+)");
var letters = match.Groups[1].Value;
var numbers = int.Parse(match.Groups[2].Value);
var formatString = "{0}{1:d" + (15 - letters.Length) + "}";
var longForm = string.Format(formatString, letters, numbers);
return longForm;
}
}
public class Result
{
public long Ticks { get; set; }
public string Name { get; set; }
public override string ToString()
{
return Name + " - " + Ticks;
}
}
您可以使用string.Format()為您處理填充。 我使用了正則表達式(不是很健壯)來解析字母和數字,但是您也許可以通過另一種方式更有效地執行此操作。
關鍵是我們動態地計算出需要多少個零,然后使用格式為X:dY
的格式字符串,其中X =格式序數,Y =您希望填充的零數。
var match = Regex.Match("ABC12", @"([^\d]+)(\d+)");
var letters = match.Groups[1].Value;
var numbers = int.Parse(match.Groups[2].Value);
var formatString = "{0}{1:d" + (15 - letters.Length) + "}";
var longForm = string.Format(formatString, letters, numbers);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.