我已经看到很多关于如何使用c#处理字符串中的字符编码的答案。
但是,我需要一个只考虑使用字符串类方法删除的回复(也是为了避免使用stringbuilder)。
这只是为了让我看到这个特定代码的问题是什么,这似乎没有摆脱电话号码中的中间空白。该代码还会删除任何其他不是数字的字符。
到目前为止,我无法理解为什么不会删除空格或两个相邻的空格。我怀疑也许对相同字符串的自我分配可能是一个问题,但我不确定。
//leave only the digits
for (int i = 0; i < enteredPhone.Length; i++)
{
switch (enteredPhone[i])
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
break;
default:
//gets rid of any other type of character
enterPhone = enteredPhone.Remove(i, 1);
break;
}
}
提前致谢。
答案 0 :(得分:4)
删除字符时尝试减去1。因为如果删除位置5和i ++中的caracter,则i的值现在为5,循环将找不到下一个字符。像这样:
default:
//gets rid of any other type of character
enterPhone = enteredPhone.Remove(i, 1);
i--;
break;
答案 1 :(得分:2)
您的问题是每次递增索引,即使您删除了非数字字符。在这种情况下,下一个字符将具有当前索引,但在下一个循环中,您将递增当前索引,从而跳过下一个字符。使用while
代替for
:
int index = 0;
while(index < enteredPhone.Length)
{
switch (enteredPhone[index])
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
index++;
break;
default:
enteredPhone = enteredPhone.Remove(index, 1);
break;
}
}
您也可以使用Char.IsDigit来简化此循环:
int index = 0;
while(index < enteredPhone.Length)
{
if (Char.IsDigit(enteredPhone[index]))
{
index++;
continue;
}
enteredPhone = enteredPhone.Remove(index, 1);
}
答案 2 :(得分:1)
忽略您奇怪的要求:
Regex.Replace(inputString, @"\D", string.Empty)
答案 3 :(得分:0)
var onlyDigits = new string(enteredPhone.Where(Char.IsDigit).ToArray());
应该比正则表达式更有效率。
答案 4 :(得分:0)
“为什么不会删除空格或两个相邻的空格” - 因为当i
.Remove
时,i
之后的所有字符索引都会减少1。
向后走绳 - 从Length-1
到0
。
答案 5 :(得分:0)
你也可以试试。但我相信Linq或Regex解决方案是更好的选择。
//leave only the digits
for (int i = enteredPhone.Length - 1; i >= 0; i--)
{
if (!Char.IsDigit(enteredPhone[i]))
{
enterPhone = enteredPhone.Remove(i, 1);
}
}