Преобразование строк в Ints - PullRequest
2 голосов
/ 30 января 2012

Хорошо, крошечный вопрос. Я знаю. Основной ответ может быть

Convert.ToInt32(string);

Но, естественно, C # выполняет все естественные процессы, чтобы быть уверенным, что этого не произойдет.

Вот мой код:

            while (true)
            {

                while (true)
                {
                    //ask for time
                    Console.WriteLine("What is the hour?");
                    Console.WriteLine();
                    string s = Console.ReadLine();
                    //convert input to int
                    YourTime.nHour = Convert.ToInt32(s);
                    //check to see if it's legal
                    if ((YourTime.nHour <= 12) || (YourTime.nHour > 0))
                    {
                        break;
                    }
                //etc etc code
                }
            }  

Я хочу убедиться, что ввод фактического часа. Когда я запускаю этот код, он всегда помечает оператор if () как «true» и прерывается, даже если я ввел что-то вроде -13 или 99.

Я уверен, что есть простая замена для «Convert.ToInt32 (s);», но, честно говоря, похоже, что я все перепробовал. Я решил, что будет лучше следовать пошаговым инструкциям людей, которые знают код под рукой.

[EDIT] - неправильный оператор, а не преобразование. Спасибо всем, кто помог!

Ответы [ 4 ]

6 голосов
/ 30 января 2012

Вам нужно использовать И , а не ИЛИ . Итак, измените его на

if ((YourTime.nHour <= 12) && (YourTime.nHour > 0)) 
3 голосов
/ 30 января 2012

Недопустимо ваше утверждение if, а Convert.ToInt32

if ((YourTime.nHour <= 12) || (YourTime.nHour > 0)) всегда будет истинным.Я думаю, что вы хотели сделать if ((YourTime.nHour <= 12) && (YourTime.nHour > 0))

2 голосов
/ 30 января 2012

Вы имеете в виду, независимо от того, какое целое число, которое вы вводите в него, всегда ломается?

Если так, то это потому, что независимо от того, какое целое число вы вводите в него, оно всегда будет проходить одно из этих условий.

т.е.Если бы я ввел 10000000, он все равно будет больше 0

, а если я введу -10000000, он все равно будет меньше 12

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

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

Таким образом, чтобы отделить его, вы можете использовать много вещей, например аннотации данныхвзгляните на следующий код

 public class MyTime
 {

 [Require]
 [Range(0, 12, ErrorMessage = "Value for {0} must be between {1} and {2}.")]
 public int Hours { get; set; }

 [Require]
 [Range(0, 59, ErrorMessage = "Value for {0} must be between {1} and {2}.")]
 public int Minutes { get; set; }

 }

. Таким образом, вы определили модель, которая может быть проверена на соответствие правилам, о которых она знает, и вы можете получить сообщение об ошибке, которое имеет смысл

PS this ссылка может показать вам, как создать собственный валидатор, если вы используете аннотации данных вне asp.net mvc

...