试图在每个空间分割一个字符串,而不是获得预期的答案

时间:2017-01-09 08:56:16

标签: c# string split stringbuilder

所以我实际上已经把自己的大部分代码都想到了,并且上周让它工作了,但是刚才我不小心删了它,所以我在这里重写! 逻辑上说,我有一个输入的TIN编号,我想将每三位数分开,以便整齐地拟合我准备好的物理形式。为此,我迭代输入,模数为3,将我的分隔符放置一个空格,然后用分隔符拆分它。

因此,以下1234567891012变为123 456 789 1012

string input = txtTIN.Text;
string digit1 = "0";
string digit2 = "0";
string digit3 = "0";
string digit4 = "0";
StringBuilder sb = new StringBuilder();
for (int i = 1; i < input.Length; i++)
{
    if (i%3 == 0)
    {
        sb.Append(' ');
        sb.Append(input[i]);
    }
}
string formatted = sb.ToString();
Console.WriteLine(formatted);
string[] formatCollection = formatted.Split(' ');
digit1 = formatCollection[0];
digit2 = formatCollection[1];
digit3 = formatCollection[2];
digit4 = formatCollection[3];

我现在意识到我在这里发布了字符串构建似乎有问题,因为Console写入从输入中返回1 4 7。不是理想的结果,但如果我没记错的话,所有的部分都已经到位了。

(注意,我不想使用Linq,Regex或Lists,尽管我知道它们是更好的选择。我自己认为这个并且希望最终看到它。)

另外,如何使123456789101251的输入变为123 456 789 101251,换句话说,我不想再分割前3,我的当前代码无法做。

6 个答案:

答案 0 :(得分:4)

您的代码存在几个问题

  1. 您使用1开始迭代,而不是0。
  2. 您在结果的开头添加了一个空格。
  3. 您只是添加每个组的第一个字符。
  4. 即使达到最大群组数量,也不会停止分组。
  5. 这可以解决您的问题:

    const int GROUP_LENGTH = 3;
    const int GROUP_COUNT = 3;
    const int MAX_GROUPED_LENGTH = GROUP_LENGTH * GROUP_COUNT;
    int groupedLength = Math.Min(input.Length, MAX_GROUPED_LENGTH);
    for (int i = 0; i < groupedLength; i++)
    {
        if ((i > 0) && ((i % GROUP_LENGTH) == 0))
        {
            sb.Append(' ');
        }
        sb.Append(input[i]);
    }
    if (input.Length > MAX_GROUPED_LENGTH)
    {
        sb.Append(' ');
        sb.Append(input, MAX_GROUPED_LENGTH, input.Length - MAX_GROUPED_LENGTH);
    }
    

答案 1 :(得分:2)

int size = 3;  //size of the chunk
int count = 3; //how many sized chunks will be splitted

int length = input.Length / size;
int iterate = length < count ? length : count;
int tailLength = input.Length - iterate * size;

for (int i = 0; i < iterate; i++)
{
    sb.Append(input.Substring(i, size));
    sb.Append(' ');
}

if (tailLength > 0)
{
    sb.Append(input.Substring(size * iterate, tailLength));
}

答案 2 :(得分:1)

在字符串中添加数字的代码位于错误的位置。如果索引mod 3为0

,则只将数字添加到字符串中
for (int i = 1; i < input.Length; i++)
{

    sb.Append(input[i]);
    if (i%3 == 0)
    {
        sb.Append(' ');            
    }
}

答案 3 :(得分:1)

function insertHTML(){
  var thead = document.getElementByID("thead");
  thead.innerHTML = theadOutput(); //function works fine
}

window.onload = function(){
  $(body).load(body_loc, insertHTML());
}

答案 4 :(得分:0)

如果你真的不想使用LINQ,我会建议用这种方式修改你的算法:

StringBuilder sb = new StringBuilder();
StringBuilder partBuilder = new StringBuilder(); 
int partsSplitted = 0;
for (int i = 1; i <= input.Length; i++)
{
    partBuilder.Append(input[i-1]);
    if (i % 3 == 0 && partsSplitted<=3)
    {
        sb.Append(' ');
        sb.Append(partBuilder.ToString());
        partBuilder = new StringBuilder();
        partsSplitted++;
    }
}
sb.Append(partBuilder.ToString());
string formatted = sb.ToString().TrimStart();

输出:

  

123 456 789 101251

改变了你的想法是最小的,整个循环是相同的。请通知:您的for循环应该到i <= input.Length而不是i < input.Length,因为您从索引1开始,而不是0。

可以低级别的人解释已接受的回答有什么问题吗?

答案 5 :(得分:-1)

//for (int i = 1; i < input.Length; i++)
  for (int i = 0; i < input.Length; i++)