所以我实际上已经把自己的大部分代码都想到了,并且上周让它工作了,但是刚才我不小心删了它,所以我在这里重写! 逻辑上说,我有一个输入的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,我的当前代码无法做。
答案 0 :(得分:4)
您的代码存在几个问题
这可以解决您的问题:
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++)