试图每隔 space 拆分一个字符串,没有得到预期的答案
Attempting to split a string every space, not getting expected answer
所以实际上大部分代码都是我自己想出来的,上周就可以运行了,但刚才我不小心删除了它,所以我在这里重写!
逻辑是这样的,我有一个 TIN 号码用于输入,我想每隔 3 个数字将其拆分一次以整齐地适合我准备的物理形式。为此,我遍历输入,以 3 为模,将我的定界符放置为 space,然后按定界符将其拆分。
所以,下面的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];
我现在意识到我 post 字符串构建似乎有问题,因为控制台写入从输入中返回 1 4 7。这不是一个理想的结果,但如果我没记错的话,所有的部分都已经到位了。
(请注意,我不想使用 Linq、Regex 或列表,尽管我知道它们是更好的选择。我自己想到了这个,并希望看到它最终起作用。)
此外,我如何才能使 123456789101251
的输入变为 123 456 789 101251
,换句话说,我不想比前 3 个更进一步地拆分,这是我当前的代码做不到。
在字符串中添加数字的代码位置错误。如果索引 mod 3 是 0
,则您只是将数字添加到字符串中
for (int i = 1; i < input.Length; i++)
{
sb.Append(input[i]);
if (i%3 == 0)
{
sb.Append(' ');
}
}
如果你真的不想使用 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 开始。
否决者能否解释已接受答案有什么问题?
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));
}
您的代码有几个问题
- 您从 1 而不是 0 开始迭代。
- 您在结果的开头添加一个 space。
- 您只添加了每组的第一个字符。
- 即使达到最大组数,您也不会停止分组。
这将解决您的问题:
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);
}
string[] result = new string[4];
int groups = input.Length / 3;
if (groups > 3) groups = 3;
int group;
for (group = 0; group < groups; group++)
{
result[group] = input.Substring(group*3, 3);
}
// Assert: group < 4
result[group] = input.Substring(group*3);
// Assert: answers in result[0..groupCount-1]
int groupCount = group+1;
所以实际上大部分代码都是我自己想出来的,上周就可以运行了,但刚才我不小心删除了它,所以我在这里重写! 逻辑是这样的,我有一个 TIN 号码用于输入,我想每隔 3 个数字将其拆分一次以整齐地适合我准备的物理形式。为此,我遍历输入,以 3 为模,将我的定界符放置为 space,然后按定界符将其拆分。
所以,下面的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];
我现在意识到我 post 字符串构建似乎有问题,因为控制台写入从输入中返回 1 4 7。这不是一个理想的结果,但如果我没记错的话,所有的部分都已经到位了。
(请注意,我不想使用 Linq、Regex 或列表,尽管我知道它们是更好的选择。我自己想到了这个,并希望看到它最终起作用。)
此外,我如何才能使 123456789101251
的输入变为 123 456 789 101251
,换句话说,我不想比前 3 个更进一步地拆分,这是我当前的代码做不到。
在字符串中添加数字的代码位置错误。如果索引 mod 3 是 0
,则您只是将数字添加到字符串中for (int i = 1; i < input.Length; i++)
{
sb.Append(input[i]);
if (i%3 == 0)
{
sb.Append(' ');
}
}
如果你真的不想使用 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 开始。
否决者能否解释已接受答案有什么问题?
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));
}
您的代码有几个问题
- 您从 1 而不是 0 开始迭代。
- 您在结果的开头添加一个 space。
- 您只添加了每组的第一个字符。
- 即使达到最大组数,您也不会停止分组。
这将解决您的问题:
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);
}
string[] result = new string[4];
int groups = input.Length / 3;
if (groups > 3) groups = 3;
int group;
for (group = 0; group < groups; group++)
{
result[group] = input.Substring(group*3, 3);
}
// Assert: group < 4
result[group] = input.Substring(group*3);
// Assert: answers in result[0..groupCount-1]
int groupCount = group+1;