【问题标题】:Test Console.ReadLine(); input type测试 Console.ReadLine();输入类型
【发布时间】:2013-07-16 12:52:45
【问题描述】:

我正在制作一个控制台应用程序,我将在其中向用户询问电话号码 int main_phone,但如果他键入一个不能转换为 int 的字符串,例如“Caramel”,我想给他一个警告并求个号码。

好吧,我认为递归函数可以,但我缺乏这方面的逻辑能力。我想出的是以下代码sn-p:

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)

【问题讨论】:

  • 正则表达式将是一条不错的路线。然后你也可以很容易地接受带有连字符的数字
  • 我刚刚运行了您的示例。如果用户输入可转换字符串,main_phone 在我这边不会返回为 null。由 Console.WriteLine(main_phone) 验证。对不起,如果我误解了你的目标。
  • @Ali.NET 尝试运行它并输入“sodapop”,然后当它给你一个错误并要求输入任何数字时。您会看到它没有返回 number ,而是返回 null。
  • 你真的不想/不需要递归。你需要一个简单的 while 循环,当输入有效时退出,就像我的回答一样

标签: c# function parsing recursion types


【解决方案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;
    }

}

【讨论】:

  • 但是每次用户输入错误时我都必须发送一条消息,如果没有递归,我该怎么做?
  • 首先你们应该把注意力从使用递归来解决这个问题上。其次,为什么不限制用户尝试输入电话号码的次数。他们不应该需要超过 2 次尝试才能做到正确。
【解决方案2】:

只使用 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】:

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

    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】:

      这是一个使用正则表达式验证循环直到产生良好匹配的解决方案

      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值。

      【讨论】:

      • 好的,但由于我不希望仅用于手机,因此我将使用 @"\d+"。但是,如果用户键入“555231409a”之类的内容怎么办?我该如何处理导致应用程序崩溃的问题?
      • 这根本不会使应用程序崩溃,它会处理得很好
      【解决方案5】:

      试试这个修改后的代码段:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-16
        相关资源
        最近更新 更多