格式化以下字符串的最有效方法是什么?

时间:2010-05-20 17:51:52

标签: c# string formatting

我有一个非常简单的问题,我不应该挂在这上面,但我是。哈哈!

我收到的字符串是以下列格式:

123

123456-D53

123455-4D

234234-4

123415

格式化后的所需输出为:

123-455-444

123-455-55

123-455-5

123-455

格式最终取决于原始字符串中的字符总数。

我有几个关于如何做到这一点的想法,但我保留了比string.Replace和concatenate更好的方法......

感谢您的建议..

伊恩

5 个答案:

答案 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的长度。这将接受任何字母数字输入,用户添加任意​​数量的垃圾,包括多余的空格。