[英]Formatting alphanumeric string
我有一個包含16個字母數字字符的字符串,例如F4194E7CC775F003。 我想將其格式化為F419-4E7C-C775-F003。
我試過用
string.Format("{0:####-####-####-####}","F4194E7CC775F003");
但這不起作用,因為它不是數值。
所以我想出了以下內容:
public class DashFormatter : IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType)
{
return this;
}
public string Format(string format, object arg, IFormatProvider formatProvider)
{
char[] chars = arg.ToString().ToCharArray();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < chars.Length; i++)
{
if (i > 0 && i % 4 == 0)
{
sb.Append('-');
}
sb.Append(chars[i]);
}
return sb.ToString();
}
}
並通過使用
string.Format(new DashFormatter(), "{0}", "F4194E7CC775F003");
我能夠解決問題,但是我希望有更好/更簡單的方法來解決它? 也許一些LINQ魔術?
謝謝。
你可以在沒有Linq的情況下在一行中完成:
StringBuilder splitMe = new StringBuilder("F4194E7CC775F003");
string joined = splitMe.Insert(12, "-").Insert(8, "-").Insert(4, "-").ToString();
您可以使用正則表達式來完成它,但我不知道將其性能與其他方法相比較。
string formattedString = Regex.Replace(yourString, "(\\S{4})\\B", "$1-");
你可以把它放在字符串的擴展方法中,如果你想這樣做:
yourString.ToDashedFormat();
如果你想要它linq:
var formatted = string.Join("-", Enumerable.Range(0,4).Select(i=>s.Substring(i*4,4)).ToArray());
如果你想要它有效:
var sb = new StringBuilder(19);
sb.Append(s,0,4);
for(var i = 1; i < 4; i++ )
{
sb.Append('-');
sb.Append(s,i*4, 4);
}
return sb.ToString();
我沒有對此進行基准測試,但我認為它會比StringBuilder.Insert更快,因為它不會多次移動字符串的其余部分,它只會寫入4個字符。 此外,它不會重新分配底層字符串,因為它在開始時預先分配給19個字符。
根據Carra的回答,我做了一個小實用方法:
private static string ToDelimitedString(string input, int position, string delimiter)
{
StringBuilder sb = new StringBuilder(input);
int x = input.Length / position;
while (--x > 0)
{
sb = sb.Insert(x * position, delimiter);
}
return sb.ToString();
}
你可以像這樣使用它:
string result = ToDelimitedString("F4194E7CC775F003", 4, "-");
一個測試用例:
[Test]
public void ReturnsDelimitedString()
{
string input = "F4194E7CC775F003";
string actual = ToDelimitedString(input, 4, "-");
Assert.AreEqual("F419-4E7C-C775-F003", actual);
}
char[] chars = "F4194E7CC775F003".ToCharArray();
var str = string.Format("{0}-{1}-{2}-{3}"
, new string(chars.Take(4).ToArray())
, new string(chars.Skip(4).Take(4).ToArray())
, new string(chars.Skip(8).Take(4).ToArray())
, new string(chars.Skip(12).Take(4).ToArray())
);
我能想到的最簡單的解決方案是
var text = "F4194E7CC775F003";
var formattedText = string.Format(
"{0}-{1}-{2}-{3}",
text.Substring(0, 4),
text.Substring(4, 4),
text.Substring(8, 4),
text.Substring(12, 4));
僅僅9年之后,卡拉的回答略有不同。 根據我的測試,這可以使速度提高2.5倍(將所有“ - ”更改為“ - ”):
StringBuilder initial = new StringBuilder("F4194E7CC775F003");
return initial.Insert(12, '-').Insert(8, '-').Insert(4, '-').ToString();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.