我正在制作一个控制台应用程序,我会向用户询问电话号码int main_phone
,但如果他输入的字符串不能转换为int,例如“Caramel”,我想给他一个警告并要求提供一个号码。
嗯,我认为递归函数会做,但我缺乏这个逻辑能力。我想出的是以下代码片段:
static int? TryParse(string str)
{
int tmp;
if (int.TryParse(str, out tmp)) {
return tmp;
}
return null;
}//End of TryParse();
static int? verifyParse(string str, string lable)
{
int? testedVar = TryParse(str);
if (testedVar == null)
{
Console.WriteLine("Este campo pode apenas conter dígitos de 0 à 9.");
Console.Write(lable);
verifyParse(Console.ReadLine(), lable);
return null;
}
else
{
return testedVar;
}
}//End of verifyParse();
Console.Write("Phone(main):");
int? main_phone = verifyParse(Console.ReadLine(),"Telefone (Principal):");
问题是如果用户输入“string”,main_phone将以null返回,那么它会询问0到9之间的数字,但即使用户传递了可转换的字符串,例如“12”,main_phone仍然会是空的。
我该如何解决?
我真正需要的是一个函数,如果字符串可以转换为int它返回int,否则它会给我一个错误并要求我输入0到9之间的东西。我发现这很难,因为函数会必须能够返回一个int或重新运行它(要求并测试一个有效的输入),但它不能,因为它返回int或它不返回任何内容。
以下是我的问题的一点点更新:
static int TryParse(string lable)
{
string str = Console.ReadLine();
Regex regex = new Regex(@"\d+");
while (!regex.IsMatch(str))
{
Console.WriteLine("Insira apenas dígitos de 0-9, por favor.");
Console.Write(lable);
str = Console.ReadLine();
}
return Convert.ToInt32(str);
}//End of TryParse();
Console.Write("Telefone (Principal):");
int main_phone = TryParse("Telefone (Principal):");
它工作得很好,除非我输入类似“1a”的东西。在那种情况下,我会收到此错误:
System.FormatException: Input string was not in a correct format. at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) at System.Convert.ToInt32(String value) at App1.Program.TryParse(String lable) at App1.Program.Main(String[] args)
答案 0 :(得分:1)
你如何以字符串形式读入用户输入的内容,将所有“ - ”替换为“”,然后检查它是否为数字并检查长度。无需为这么简单的任务制作递归方法。
这个怎么样
[VB.NET]
Function CheckPhoneNumber(ByVal Number As String) As String
Number = Number.Replace("-","")
Number = Number.Replace("(","")
Number = Number.Replace(")","")
If Not IsNumeric(Number) Then
Return "Error"
Else
Return Number
End If
End Function
[C#]
public string CheckPhoneNumber(string Number)
{
Number = Number.Replace("-", "");
Number = Number.Replace("(", "");
Number = Number.Replace(")", "");
if (!Information.IsNumeric(Number)) {
return "Error";
} else {
return Number;
}
}
答案 1 :(得分:1)
这是一个使用正则表达式验证循环直到产生良好匹配的解决方案
Regex regex = new Regex(@"\d{3}-?\d{3}-?\d{4}");
string phonenumber = Console.ReadLine();
while (!regex.IsMatch(phonenumber))
{
Console.WriteLine("Bad Input");
phonenumber = Console.ReadLine();
}
return Convert.ToInt32(phonenumber.Replace("-",""));
将匹配5555555555和555-555-5555,并返回int值。
答案 2 :(得分:0)
如何使用int.TryParse?
void Main()
{
var input = Console.ReadLine();
int phone;
while(!int.TryParse(input, out phone)){
Console.WriteLine("Please enter a number");
input = Console.ReadLine();
}
Console.WriteLine("Success");
}
要清理输入,您可以替换“ - ”
var input = Console.ReadLine().Replace("-", "");
答案 3 :(得分:0)
可以删除任何多余的字符('+',' - ','#','(',')'和'*',然后尝试
bool successful;
int result;
if(!int.tryparse(string, result))
{
Console.WriteLine("Invalid phone number");
}
else
{
Console.WriteLine("Valid phone number");
}
或者你喜欢什么。
当然,另一种方法是使用REGEX。 (注意:我从这里发现的Regex Hero中窃取了这个:http://regexhero.net/tester/)
string strRegex = @"[+]?[\d][\d\s()-.]{8,}[\d]";
RegexOptions myRegexOptions = RegexOptions.None;
Regex myRegex = new Regex(strRegex, myRegexOptions);
foreach (Match myMatch in myRegex.Matches(strTargetString))
{
if (myMatch.Success)
{
// Add your code here
}
}
答案 4 :(得分:0)
尝试修改后的代码段版本:
static int? verifyParse(string str, string lable)
{
int? testedVar = TryParse(str);
if (testedVar == null)
{
Console.WriteLine("Este campo pode apenas conter dígitos de 0 à 9.");
Console.Write(lable);
int? newVal = verifyParse(Console.ReadLine(), lable);
if (newVal != null)
return newVal;
else
return null;
}
else
{
return testedVar;
}
}//End of verifyParse();