Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';格式化以下字符串的最有效方法是什么?_C#_String_Formatting - Fatal编程技术网

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

C# 什么';格式化以下字符串的最有效方法是什么?,c#,string,formatting,C#,String,Formatting,我有一个非常简单的问题,我不应该被挂断,但我是。哈哈 我收到以下格式的字符串: 123 123456-D53 123455-4D 234234-4 123415 所需的输出(后期格式化)为: 123-455-444 123-455-55 123-455-5 或 123-455 格式最终取决于原始字符串中的字符总数 我有几个想法如何做到这一点,但我保留的东西有一个更好的方式比字符串。替换和连接 谢谢你的建议 Ian编辑:查看旧版本的历史记录。 只能用于查找数字 var output = new S

我有一个非常简单的问题,我不应该被挂断,但我是。哈哈

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

123

123456-D53

123455-4D

234234-4

123415

所需的输出(后期格式化)为:

123-455-444

123-455-55

123-455-5

123-455

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

我有几个想法如何做到这一点,但我保留的东西有一个更好的方式比字符串。替换和连接

谢谢你的建议

Ian

编辑:查看旧版本的历史记录。
只能用于查找数字

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('-');
这个代码应该从左到右填充(现在我知道了,先读,然后编码)…

很抱歉,我现在仍然无法测试这一点。

我假设这不仅仅依赖于始终是数字的输入?如果是这样的话,我正在考虑这样的事情

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();
}
私有字符串ApplyCustomFormat(字符串输入)
{
StringBuilder=新的StringBuilder(输入。替换(“-”,”);
int指数=3;
while(索引
Tanascius是对的,但我不能评论或投票,因为我没有代表,但如果你想了解字符串格式的更多信息,我觉得这很有帮助。
不是最快的,但是很容易看(ed:to read):

字符串规格化(字符串值)
{
if(String.IsNullOrEmpty(value))返回值;
int=0;
var builder=新的StringBuilder(value.Length+value.Length/3);
对于(int ii=0;ii

使用猜测预分配
StringBuilder
的长度。这将接受任何字母数字输入以及用户添加的任意数量的垃圾,包括多余的空格。

这里有一个方法,它使用正则表达式和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);
string s=“123456-D53”;
string[]groups=Regex.Matches(s,@“\w{1,3}”)
.Cast()
.Select(匹配=>match.Value)
.ToArray();
字符串结果=string.Join(“-”,组);
结果:

123-456-D53 123-456-D53
你确定效率是这里最重要的指标,而不是可读性吗?您是否分析过这是您计划中的瓶颈?两个帐户都没有。事实上,我确信这不是瓶颈,效率也不是最重要的指标。我只是好奇,整天都在想这件事。:)我想澄清一下我原来的帖子,字符串可以是字母数字,而不仅仅是数字。我想这会把数字填错方向。可以说,他想让它左对齐。@Ian:我现在用char.IsDigit@sixlettervariables:你是对的,这让它变得更加困难。@Ian:现在我的解决方案是删除字母。。。希望您想要这个,因为您的问题不清楚(所有输出都有数字),我不在最新的.Net上,所以这可能已被更改,但不应该用
==“-”
替换
==“-”
?这与我的实现类似。。我刚刚被问到“这是做这件事最有效的方法吗?”这个问题。@Ian P--“最有效”不如“足够有效”。见第一条评论。我很想编写使用IEnumerable chunker(方法或正则表达式)和String.Join;-)的“效率较低”的代码选择这个作为答案,因为它首先按照我描述的规范工作。尽管如此,其他海报也按照要求更新了代码。所有的都是绿色的复选标记,但我只能给出一个:)哈哈,我们必须有不同类型的眼睛:pYou应该检查
(ii+1)%3==0
@0xA3:good catch@pst:如果我回来读这篇文章,很明显发生了什么。没有混淆;)您更新了代码,但仍然是错误的;-)所以要么检查
((builder.Length+1)%4)==0
,要么检查
((ii+1)%3==0)
。我应该告诉你我删除了我的答案:-)。OP改变了问题,不再适用。此外,SixlettVariable指出,它实际上也没有回答原来的问题。 123-456-D53