【问题标题】:Determine if argument is numeric确定参数是否为数字
【发布时间】:2012-02-03 09:25:33
【问题描述】:

在我的应用程序中,我有一个将三个数字作为参数的方法。但是,该方法只能将数值作为参数,因此我需要检查参数是否为数字。我怎样才能以一种简单且最好优雅的方式做到这一点?谢谢提前

  public Triangle(double a, double b, double c) {
      if ((a != ?) || (b != ?) || (c != ?)){
            throw new ArgumentException("Not a number")
      }   
    sides = new double[] { a, b, c };
  } 

【问题讨论】:

  • 您将双精度数作为参数传递,它们怎么可能不是数字?
  • 在 C# 中键入为 double 的参数怎么可能不是数字?你确定你的意思不是数字必须是正数,或者它们必须满足三角不等式吗?
  • 喜剧选项:参考 vb.net 程序集,并调用 IsNumeric:msdn.microsoft.com/en-us/library/6cd3f6w1(v=vs.71).aspx

标签: c# variables arguments


【解决方案1】:

尝试使用 AJAX - 过滤文本框扩展器并将其配置为仅接受数字,这样无需任何编码即可解决您的问题。

【讨论】:

    【解决方案2】:

    如果您有必须转换为双精度的字符串,您还可以在进行测试和转换时进行重载:

    public Triangle(double a, double b, double c) {  
        sides = new double[] { a, b, c };
    }  
    
    public Triangle(string a, string b, string c) {
        double aa, bb, cc;
        if (double.TryParse(a, out aa) && double.TryParse(b, out bb) && double.TryParse(c, out cc)) {  
            sides = new double[] { aa, bb, cc };
        } else {
            throw new ArgumentException("Not a number");
        }
    }  
    

    但是,编译器永远不会允许您将字符串分配给双变量或方法参数。

    【讨论】:

      【解决方案3】:

      使用您的原型:

      public Triangle(double a, double b, double c)
      

      如果您尝试将非双精度值传递给该方法,编译器应该会抛出错误。但是,如果您从键盘读取输入作为字符串,并且您需要检查这些字符串是否为双精度字符串,则可以使用

      double.TryParse(string, num);
      

      【讨论】:

        【解决方案4】:

        使用IsNaN()(不是数字)。

        if (double.IsNaN(a) || double.IsNaN(b) || double.IsNaN(c))
            throw new ArgumentException(...)
        

        【讨论】:

        • IsNaN 不能用于评估恰好是非数字的“正常”参数。仅当您尝试了结果在数学上未定义的某些操作(例如除以零)时,这才会评估为真。但是 OP 想要的是确保他的方法是用数字参数而不是字符串等调用的。
        • @Roy Dictus:我在原始问题中没有看到任何关于针对字符串进行测试的内容。事实上,使用强类型 double 参数可以防止这种情况发生。
        【解决方案5】:

        由于 C# 是强类型的,所以 double 始终是数值。您无需检查它是否真的是一个数字,因为永远不会发生相反的情况。

        如果您有三个 objects 作为参数,您会尝试强制转换它们或检查它们的类型。

        【讨论】:

          【解决方案6】:

          在您当前的代码示例中,根据定义,这些值是“数字”,它们被键入为double。查看Double 上的公共常量,即NaN、PositiveInfinity 和NegativeInfinity,以了解双精度值的边缘情况。

          如果您想根据用户输入测试这些值是否实际上是非数字,您的参数应该输入为string,您可以使用Double.TryParse(返回bool)或Double.Parse(抛出异常) 来测试它们是否是数字。

          【讨论】:

          • +1 用于提及这些边界情况,因为可以认为 NaN(不是数字)是“非数字”。请注意,您不能直接与 NaN 进行比较(所有与 NaN 的比较都返回 false),而必须使用 double.IsNaN 进行检查。
          【解决方案7】:

          C# 是强类型的。因此,如果您指定参数为数字,您将无法使用非数字参数调用您的方法。

          【讨论】:

          • 好吧,由于这个原因,如果参数不是数字,我想我不能在方法内抛出异常?
          • 编译器甚至不允许使用非数字参数调用您的方法,因此您无法检查非数字参数,因此尝试这样做是徒劳的。
          • 如果参数不是数字,它不应该编译。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-12-16
          • 2014-06-05
          • 2015-01-22
          • 1970-01-01
          • 2012-11-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多