0

我正在制作一个控制台应用程序,我会在其中向用户询问电话号码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):");

问题是如果用户输入“字符串” main_phone 将返回为空,那么它会要求一个介于 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:输入字符串的格式不正确。
   在 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   在 System.Number.ParseInt32(String s,NumberStyles 样式,NumberFormatInfo 信息)
   在 System.Convert.ToInt32(字符串值)
   在 App1.Program.TryParse(字符串标签)
   在 App1.Program.Main(String[] args)

4

5 回答 5

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;
    }

}
于 2013-07-17T19:42:53.583 回答
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 值。

于 2013-07-17T19:52:13.967 回答
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();
于 2013-07-17T20:02:22.570 回答
0

可以去掉任何多余的字符('+'、'-'、'#'、'('、')' 和 '*')然后尝试

bool successful;
int result;
if(!int.tryparse(string, result))
{
    Console.WriteLine("Invalid phone number");
}
else
{
    Console.WriteLine("Valid phone number");
}

或者任何你喜欢的。

当然,另一种选择是使用 REGEX。(注意:我从这里发现的正则表达式英雄那里偷了这个: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
  }
}
于 2013-07-17T19:51:56.087 回答
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("-", "");
于 2013-07-17T19:45:00.870 回答