我有一个非常简单的问题,不应该被卡住,但我现在卡住了。哈哈!
我收到的字符串格式如下:
123
123456-D53
123455-4D
234234-4
123415
期望的输出格式是:
123-455-444
123-455-55
123-455-5
或者
123-455
格式最终取决于原始字符串中的字符总数。
我有几种方法可以做到这一点,但我一直认为还有比string.Replace和连接更好的方法...
感谢您的建议。
Ian
我有一个非常简单的问题,不应该被卡住,但我现在卡住了。哈哈!
我收到的字符串格式如下:
123
123456-D53
123455-4D
234234-4
123415
期望的输出格式是:
123-455-444
123-455-55
123-455-5
或者
123-455
格式最终取决于原始字符串中的字符总数。
我有几种方法可以做到这一点,但我一直认为还有比string.Replace和连接更好的方法...
感谢您的建议。
Ian
Tanascius是正确的,但由于我的声誉不足,我无法发表评论或点赞,但如果您想要有关string.format的其他信息,我发现这个链接很有帮助。http://blog.stevex.net/string-formatting-in-csharp/
编辑:查看历史版本。
您可以使用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('-');
这段代码应该从左到右填充(现在我明白了,先读懂再写代码)...
抱歉,我现在还无法测试它。
==“-”
不应该被替换为=='-'
吗? - Brianprivate 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();
}
这里有一种方法,它使用正则表达式和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
不是最快的,但很容易看懂(注:阅读):
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
的长度。这将接受任何字母数字输入,用户可以添加任意数量的垃圾,包括多余的空格。
(ii + 1) % 3 == 0
。 - Dirk Vollmar((builder.Length+ 1) % 4) == 0
或者((ii + 1) % 3 == 0)
。 - Dirk Vollmar