Определите, является ли аргумент числовым - PullRequest
0 голосов
/ 05 января 2012

В моем приложении у меня есть метод, который принимает три числа в качестве аргументов. Однако метод должен принимать только числовые значения в качестве аргументов, и поэтому мне нужно проверить, являются ли аргументы числовыми или нет. Как я могу сделать это простым и желательно элегантным способом? Спасибо заранее

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

Ответы [ 7 ]

5 голосов
/ 05 января 2012

C # строго типизирован. Поэтому, если вы укажете, что ваши параметры являются числовыми, вы не сможете вызывать свой метод с нечисловыми параметрами.

1 голос
/ 05 января 2012

с вашим прототипом:

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

компилятор должен выдать ошибку, если вы попытаетесь передать в метод что-либо, кроме double. Однако, если вы читаете ввод с клавиатуры, скажем, как строку, и вам нужно проверить, являются ли эти строки двойными, вы можете использовать

double.TryParse(string, num);
1 голос
/ 05 января 2012

В вашем текущем примере кода значения являются «числовыми» по определению, они набираются как double. Посмотрите на публичные константы на Double, а именно NaN, PositiveInfinity и NegativeInfinity для крайние случаи двойных значений.

Если вы хотите проверить, являются ли значения на самом деле не числовыми на основе пользовательского ввода, ваши аргументы должны быть набраны как string, и вы можете использовать Double.TryParse (возвращает bool) или Double.Parse (создает исключение), чтобы проверить, являются ли они числовыми.

0 голосов
/ 05 января 2012

Если у вас есть строки, которые нужно преобразовать в double, вы также можете получить перегрузку при выполнении тестов и преобразований:

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

Однако компилятор никогда не позволит вам присвоить строку двойной переменной или параметру метода.

0 голосов
/ 05 января 2012

попробуйте использовать AJAX-фильтрованный расширитель текстового поля и настроить его на прием только чисел, и это решит вашу проблему без какого-либо кодирования.

0 голосов
/ 05 января 2012

Использовать IsNaN() (не число).

if (double.IsNaN(a) || double.IsNaN(b) || double.IsNaN(c))
    throw new ArgumentException(...)
0 голосов
/ 05 января 2012

Поскольку C # строго типизирован, double всегда является числовым значением. Вам не нужно проверять, действительно ли это число, поскольку никогда не произойдет обратного.

если бы у вас было три objects в качестве аргумента, вы бы попытались разыграть их или проверить их тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...