我正在创建一个接受字符串的短代码,并将其输出为格式化的电话号码。
代码如下所示:
public static void Main()
{
{
StringBuilder phoneNumber = new StringBuilder("(559) 440-9safa071",20);
string enteredPhoneNumber = "(559) 440-9safa071";
for (int i = 0; i < phoneNumber.Length-1; i++)
{
Console.WriteLine("Testing: " + phoneNumber[i]);
if (phoneNumber[i] == ' ' || Char.IsWhiteSpace(phoneNumber[i]))
{
phoneNumber.Remove(i, 1);
}
else if (char.IsNumber(phoneNumber[i]) == false)
{
phoneNumber.Remove(i, 1);
}
}
Console.WriteLine("Entered Phone Number:" + enteredPhoneNumber + "\n " + phoneNumber);
}
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我无法删除 559 和 440 之间的空格,并且某些字母似乎被删除而其他字母则没有。
这是输出:
Testing: (
Testing: 5
Testing: 9
Testing: )
Testing: 4
Testing: 4
Testing: 0
Testing: -
Testing: s
Testing: f
Testing: 0
Testing: 7
Entered Phone Number:(559) 440-9071
559 4409aa071
Run Code Online (Sandbox Code Playgroud)
我花了大约一个小时试图修补、更改关键字,甚至尝试使用在线编译器来检查我的 Visual Studio 是否正常运行,但我找不到解决方案。
StringBuilder 的内容在您处理它时会被修改。
也就是说,如果您删除一个字符并执行i++,它将跳过一个字符。
有几种选择,其中许多很难阅读。即时解决方案:i++在 for 循环中删除,仅在不删除字符时增加,如下所示:
for (int i = 0; i < phoneNumber.Length-1;) // <-- removed i++
{
Console.WriteLine("Testing: " + phoneNumber[i]);
if (phoneNumber[i] == ' ' || Char.IsWhiteSpace(phoneNumber[i]))
{
phoneNumber.Remove(i, 1);
}
else if (char.IsNumber(phoneNumber[i]) == false)
{
phoneNumber.Remove(i, 1);
}
else
{
i++; // <-- added i++
}
}
Run Code Online (Sandbox Code Playgroud)
一种更具可读性的方法是将结果存储在一个新变量中:
string result = "";
for (int i = 0; i < phoneNumber.Length-1;i++)
{
Console.WriteLine("Testing: " + phoneNumber[i]);
if (phoneNumber[i] != ' ' &&
!Char.IsWhiteSpace(phoneNumber[i]) &&
char.IsNumber(phoneNumber[i]))
{
result += phoneNumber[i];
}
}
Run Code Online (Sandbox Code Playgroud)
这揭示了条件的明显优化:
string result = "";
for (int i = 0; i < phoneNumber.Length-1;i++)
{
Console.WriteLine("Testing: " + phoneNumber[i]);
if (char.IsNumber(phoneNumber[i]))
{
result += phoneNumber[i];
}
}
Run Code Online (Sandbox Code Playgroud)