C# 测试控制台.ReadLine();输入类型
我正在制作一个控制台应用程序,在这个应用程序中,我会要求用户输入一个电话号码C# 测试控制台.ReadLine();输入类型,c#,function,parsing,recursion,types,C#,Function,Parsing,Recursion,Types,我正在制作一个控制台应用程序,在这个应用程序中,我会要求用户输入一个电话号码int main\u phone,但是如果他输入一个不能转换为int的字符串,比如“Caramel”,我想给他一个警告并要求输入一个号码 我原以为递归函数就可以了,但我对这个函数缺乏逻辑上的天赋。我想到的是以下代码片段: static int? TryParse(string str) { int tmp; if (int.TryParse(str, out tmp)) { return
int main\u 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仍将为null
我怎样才能解决这个问题
编辑1:
我真正需要的是一个函数,如果字符串可以转换为int,它将返回int,否则它将给我一个错误,并要求我输入0到9之间的内容。我觉得这很难,因为函数必须能够返回一个int或重新运行它(要求并测试一个有效的输入),但它不能,因为它要么返回int,要么什么都不返回
编辑2:
以下是关于我的问题的一些更新:
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:输入字符串的格式不正确。
位于System.Number.StringToNumber(字符串str、NumberStyles选项、NumberBuffer&Number、NumberFormatInfo信息、布尔解析十进制)
在System.Number.ParseInt32(字符串s、NumberStyles样式、NumberFormatInfo信息)
在System.Convert.ToInt32处(字符串值)
在App1.Program.TryParse(字符串标签)
在App1.Program.Main处(字符串[]args)
你只需把用户输入的内容作为字符串读入,将所有“-”替换为“”,然后检查它是否为数字,并检查长度。对于这样一个简单的任务,不需要使用递归方法 这个怎么样 [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#]
使用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");
}
要清理输入,可以替换“-”
可以去掉任何额外的字符(“+”、“-”、“#”、“(”、“)”和“*”),然后重试 或者你喜欢的任何东西 当然,另一种选择是使用正则表达式。(注意:我是从这里找到的正则表达式英雄那里偷来的:)
这里有一个解决方案,使用正则表达式验证循环直到生成一个好的匹配
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("-",""));
它将匹配5555和555-555-5555,并返回int值。尝试此代码段的修改版本:
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();
正则表达式将是一个很好的途径。然后你可以很容易地接受带有连字符的数字,我只是运行了你的示例。在用户输入可转换字符串的情况下,main_phone在我这边不会返回null。由控制台验证。WriteLine(主电话)。抱歉,如果我误解了您的目标。@Ali.NET尝试运行它并输入“sodapop”,然后当它给您一个错误并要求输入一个数字时,输入任意数字。您将看到它不返回数字,而是返回null。您确实不想/不需要递归。你需要一个简单的while循环,当输入有效时退出,就像在我的回答中一样。但是,每次用户输入错误时,我都必须发送一条消息,没有递归,我怎么做?首先,你应该远离使用递归来解决这个问题。其次,为什么不限制用户输入电话号码的次数呢。他们应该不需要超过2次的尝试才能正确。好的,但因为我不想只在手机上使用@“\d+”。但是,如果用户键入类似“555231409a”的内容,该怎么办?我如何处理在不破坏应用程序的情况下出现的问题?这根本不会破坏应用程序,它会处理得很好
var input = Console.ReadLine().Replace("-", "");
bool successful;
int result;
if(!int.tryparse(string, result))
{
Console.WriteLine("Invalid phone number");
}
else
{
Console.WriteLine("Valid phone number");
}
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
}
}
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("-",""));
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();