Test Console.ReadLine();输入类型

时间:2013-07-17 19:39:06

标签: c# function parsing recursion types

我正在制作一个控制台应用程序,我会向用户询问电话号码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仍然会是空的。

我该如何解决?

编辑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: 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)

5 个答案:

答案 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();