我有一个非常简单的问题,我不应该挂在这上面,但我是。哈哈!
我收到的字符串是以下列格式:
123
123456-D53
123455-4D
234234-4
123415
格式化后的所需输出为:
123-455-444
123-455-55
123-455-5
或
123-455
格式最终取决于原始字符串中的字符总数。
我有几个关于如何做到这一点的想法,但我保留了比string.Replace和concatenate更好的方法......
感谢您的建议..
伊恩
答案 0 :(得分:4)
Tanascius是对的,但我不能评论或upvote由于我缺乏代表,但如果你想了解string.format的其他信息我发现这很有帮助。 http://blog.stevex.net/string-formatting-in-csharp/
答案 1 :(得分:2)
编辑:查看旧版本的历史记录。
您可以使用char.IsDigit()来查找数字。
var output = new StringBuilder();
var digitCount = 0;
foreach( var c in input )
{
if( char.IsDigit( c ) )
{
output.Append( c );
digitCount++;
if( digitCount % 3 == 0 )
{
output.Append( "-" );
}
}
}
// Remove possible last -
return output.ToString().TrimEnd('-');
此代码应从左到右填充(现在我得到它,先读取,然后代码)...
对不起,我现在仍然无法测试。
答案 2 :(得分:2)
我认为这不仅仅依赖于输入总是数字?如果是这样,我正在考虑这样的事情
private string ApplyCustomFormat(string input)
{
StringBuilder builder = new StringBuilder(input.Replace("-", ""));
int index = 3;
while (index < builder.Length)
{
builder.Insert(index, "-");
index += 4;
}
return builder.ToString();
}
答案 3 :(得分:2)
这是一种方法,它使用正则表达式和LINQ的组合一次提取三个字母的组,然后再将它们连接在一起。注意:它假定输入已经过验证。验证也可以使用正则表达式完成。
string s = "123456-D53";
string[] groups = Regex.Matches(s, @"\w{1,3}")
.Cast<Match>()
.Select(match => match.Value)
.ToArray();
string result = string.Join("-", groups);
结果:
123-456-D53
答案 4 :(得分:0)
不是最快,但很容易看到( ed:to read ):
string Normalize(string value)
{
if (String.IsNullOrEmpty(value)) return value;
int appended = 0;
var builder = new StringBuilder(value.Length + value.Length/3);
for (int ii = 0; ii < value.Length; ++ii)
{
if (Char.IsLetterOrDigit(value[ii]))
{
builder.Append(value[ii]);
if ((++appended % 3) == 0) builder.Append('-');
}
}
return builder.ToString().TrimEnd('-');
}
使用猜测预先分配StringBuilder
的长度。这将接受任何字母数字输入,用户添加任意数量的垃圾,包括多余的空格。