CS193P - Добавление кнопки с плавающей запятой в калькулятор iOS - PullRequest
7 голосов
/ 18 июня 2011

Я недавно начал посещать онлайн-курс по разработке iPhone для Стэнфордского университета в iTunes U.

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

Ваш калькулятор уже работает с числами с плавающей запятой (например, если вы нажмете 3/4 = он будет правильно показывать результирующее значение 0,75), однако для пользователя нет способа ввести число с плавающей запятой. Исправьте это. Разрешить только допустимые числа с плавающей запятой вводимые числа (например, «192.168.0.1» не является допустимым числом с плавающей запятой).

Прежде всего, я не уверен, считается ли число с плавающей точкой digitPressed или operationPressed. Я даже попробовал с новым методом floatingPointPressed, но это не сработало. Может ли кто-нибудь предоставить указатели на это?

Когда я увидел его как digitPressed, я попробовал что-то вроде этого:

    if (hasFloatingPoint) {
        NSRange range = [[display text] rangeOfString:@"."];
        if (range.location == NSNotFound) 
        {
            [display setText:[[display text] stringByAppendingFormat:digit]];
            hasFloatingPoint = YES;
        }
    }
    else {
        [display setText:[[display text] stringByAppendingFormat:digit]];
    }

Но мне здесь не хватает ключевой концепции, я думаю.

Я также попробовал другое решение, которое я, к сожалению, уже отменил, поэтому я не могу предоставить код, но случилось следующее: я мог нажать число, скажем 5, а затем с плавающей точкой и 3 так что я бы в итоге получил 5.3. Затем мне удалось «отключить» число с плавающей запятой для оставшейся части ввода. Но я думаю, что я был слишком строг к этому: я не мог, например, вставить 5.3.2, но после нажатия кнопки операции ( + и т. Д.), Он все равно не позволит мне нажать кнопку с плавающей запятой. Думаю, мне следует сбросить бул, который я использовал для этого?

Я не ищу полностью выписанное здесь решение, но не мог бы кто-нибудь так любезно дать несколько основных советов о том, как решить эту проблему? Какой-то пошаговый обзор того, что я должен делать и думать, фактически не предлагая решения для кода.

Заранее спасибо.

Ответы [ 10 ]

5 голосов
/ 18 июня 2011

Хорошо.Я решил это.Было довольно легко, когда мне удалось обернуть голову вокруг него:

-(IBAction)digitPressed:(UIButton *)sender
{
    NSString *digit = [[sender titleLabel] text];
    NSRange range = [[display text] rangeOfString:@"."];
    if (userIsInTheMiddleOfTypingANumber) 
    {
        if ( ! ([digit isEqual:@"."] && (range.location != NSNotFound))) {
            [display setText:[[display text] stringByAppendingFormat:digit]];
        }
    }
    else 
    {
        if ([digit isEqual:@"."]) {
            [display setText: @"0."];
        }
        else {
            [display setText: digit];
        }

        userIsInTheMiddleOfTypingANumber = YES;

    }

}
2 голосов
/ 24 сентября 2012
-(IBAction)floatingPoint:(UIButton *)sender {

    NSString *digit = sender.currentTitle;

    NSRange range = [self.display.text rangeOfString:@"."];

    if(range.location == NSNotFound){

        self.display.text = [self.display.text stringByAppendingString:digit];

       self.userIsInTheMiddleOfEnteringANumber = YES;

    }

}
2 голосов
/ 18 июня 2011

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

Это правильный способ проверки ввода, а не проверка вручнуюкаждый символ, который пользователь вводит сам.

edit Я только что прочитал задание, которое вы пытаетесь выполнить.Я думаю, что мой ответ здесь, хотя все еще правильный способ сделать это, не лучший способ сделать то, что задание пытается заставить вас сделать.

Поскольку вы читаете цифры по порядку, как они естьдобавление к представлению и добавление их к номеру, с которым вы работаете, может оказаться на правильном пути с вашим исходным ответом:

  • Продолжайте принимать числа по мере их добавления
  • ДобавитьdecimalEntered флаг - инициализируйте его как «НЕТ»
  • Если введен десятичный знак, отметьте флаг, если нет, примите его и установите флаг ДА
  • Если десятичный знаквведен и флаг ДА, не принимайте его.
  • Каждый раз, когда вы нажимаете операнд, установите этот флаг обратно на НЕТ.

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

1 голос
/ 04 марта 2012

Это мое первое решение, оно не выглядит в стиле объективного C, но работает ...

- (IBAction)digitPressed:(UIButton *)sender 
{
    NSString *digit = [sender currentTitle];
    if ([digit isEqualToString:@"."]) {
        self.numberOfDot ++;
    }
    if (self.userIsInTheMiddleOfEnteringANumber){
        if (self.numberOfDot < 2) {
            self.display.text = [self.display.text stringByAppendingString:digit]; 
        } 
        else
            if (![digit isEqualToString:@"."])
                self.display.text = [self.display.text stringByAppendingString:digit];   
    }
    else {
        self.display.text = digit;
        self.userIsInTheMiddleOfEnteringANumber = YES;
    }
}
1 голос
/ 05 февраля 2012

Мне не удалось заставить любой из приведенных выше кодов работать с калькулятором CS193P Fall 2011. Вот как я, наконец, заставил его работать.

-(IBAction)digitPressed:(UIButton *)sender
{ // Begin ACTION

    NSString *digit = sender.currentTitle;

    if (self.userIsInTheMiddleOfEnteringNumber) 
    {
        //Check to see if a decimal was entered
        if ([digit isEqual:@"."])
        {
            //Check to see if a decimal was entered before
            if (self.decimalEntered)
               {
                   [self Display];
               }
               else
                   {
                       self.Display.text = [self.Display.text stringByAppendingString: digit];
                       self.decimalEntered = YES;
                   }
        }
        else
        {
            self.Display.text = [self.Display.text stringByAppendingString: digit];
        }
    }  
    else 
    { 
        if ([digit isEqual:@"."])
        {
            //First Decimal Entered";
            self.Display.text = digit;
            self.decimalEntered = YES;
        }
        else
        {
            //First Number Entered";
            self.Display.text = digit;
        }
        // This tells the Brain that the user is typing      
        self.userIsInTheMiddleOfEnteringNumber = YES;
    }

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

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

-(IBAction)digitPressed:(UIButton *)sender
{
    NSString *digit = [[sender titleLabel] text];

    if(userIsInTheMiddleOfTypingANumber)
    {
        [display setText:[[display text] stringByAppendingFormat:digit]];
    }
    else
    {
        if([digit isEqual:@"."]) //check for the decimal and append to the digits
            [display setText:@"."];
        else
            [display setText:digit];

        userIsInTheMiddleOfTypingANumber = YES;
    }
}
1 голос
/ 04 декабря 2011

Я увидел, что он предлагает добавить функцию для обработки десятичной дроби после того, как я начал с этого бита и закончил с этим.десятичный флаг сбрасывается при нажатии.и чтобы действительно завершить это, он, вероятно, должен также запретить ведущие 0.

if (userIsInTheMiddleOfTypingANumber) {
    if ([digit isEqual:@"."]) {
    if (!userIsInTheMiddleOfTypingADecimal) {
        [display setText:[[display  text] stringByAppendingString:digit]];
        userIsInTheMiddleOfTypingADecimal = YES;
    }
    }else {

    [display setText:[[display  text] stringByAppendingString:digit]];
    }
}
else//new number
{
    if ([digit isEqual:@"."]) {
        if (!userIsInTheMiddleOfTypingADecimal) {// this is a superfluous check as if it's a new number it is also not a decimal.

            [display setText:@"0."];
            userIsInTheMiddleOfTypingADecimal = YES;
            userIsInTheMiddleOfTypingANumber = YES;
        }
    }else {
    [display setText:digit];
    userIsInTheMiddleOfTypingANumber  = YES;
    }
}
1 голос
/ 14 октября 2011

Я считаю, что это проще.

- (IBAction)digitPressed:(UIButton *)sender
{ 
    NSString *digit =[[sender titleLabel] text];
    NSRange range =[[display text]  rangeOfString:@"."];
    if (([digit isEqual:@"."])&&(range.location==NSNotFound)){midtype=YES;}

    if (midtype){
    if (([digit isEqual:@"."])&&(range.location!=NSNotFound))       
         {[display setText:[display text]];}
    else {[display setText:[[display text]stringByAppendingString:digit]];}

    }
    else {[display setText:digit];
    midtype =YES;
}

}
1 голос
/ 26 июля 2011

Эй, я думаю, у меня есть простое решение, которое работает:)

- (IBAction)digitPressed:(UIButton *)sender
{
    NSString *digit = [[sender titleLabel] text];

    NSRange range = [[display text] rangeOfString:@"."];
    if (range.location != NSNotFound && [digit isEqual:@"."]) {
        return;
    }

    if (userIsInTheMiddleOfTypingANumber)
    {   
        [display setText:[[display text] stringByAppendingString:digit]];
    } 
    else 
    {   
        [display setText:[digit isEqual:@"."] ? @"0." : digit];
        userIsInTheMiddleOfTypingANumber = YES;
    }
}
1 голос
/ 23 июля 2011

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

if (userIsInTheMiddleOfTypingANumber) {

    // Allow floating point numbers to be input. Malformed numbers are replaced by 0

    NSScanner *scanner = [NSScanner scannerWithString:display.text];
    double d;
    BOOL wellFormedDouble = [scanner scanDouble:&d];

    if (wellFormedDouble && [scanner isAtEnd]) {
        brain.operand=d;
    }
    else {
        brain.operand=0;
    }

    userIsInTheMiddleOfTypingANumber = NO;
}
...