【问题标题】:CS193P - Adding floating point button to iOS calculatorCS193P - 向 iOS 计算器添加浮点按钮
【发布时间】:2011-06-18 12:29:20
【问题描述】:

我最近开始在 iTunes U 上关注斯坦福大学关于 iPhone 开发的在线课程。

我现在正在为前几节课做家庭作业。我完成了构建基本计算器的演练,但现在我正在尝试第一个作业,但似乎无法解决。如下:

您的计算器已经可以处理浮点数(例如,如果您按 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,但在按下操作按钮后( + 等),它仍然不允许我按下浮点按钮。我想我应该重置我用于此的布尔值?

我不是在这里寻找一个完整的书面解决方案,但是有人可以提供一些关于如何解决这个问题的基本建议吗?对我应该做什么和思考的事情进行某种分步概述,但实际上并未提供代码解决方案。

提前致谢。

【问题讨论】:

    标签: objective-c ios floating-point cs193p


    【解决方案1】:

    好的。我解决了这个问题。一旦我设法绕开它,就相当容易了:

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

      既然您想知道在哪里查看,请查看将NSNumberFormatter 附加到输入字段。

      这是验证输入的正确方法,而不是手动检查用户自己输入的每个字符。

      编辑 我刚刚阅读了您正在尝试完成的作业。我认为我的回答在这里,虽然仍然是正确的方法,但不是完成任务试图让你做的事情的最佳方法。

      由于您在将数字添加到视图时一一读取并将它们附加到您正在操作的数字上,因此您的原始答案可能在正确的轨道上:

      • 在添加数字时继续接受数字
      • 添加 decimalEntered 标志 - 将其初始化为“NO”
      • 如果输入小数,检查标志,如果不是,接受它并将标志设置为是
      • 如果输入小数且标志为 YES,则不接受。
      • 每当您按下操作数时,将此标志设置回 NO。

      当您了解更多信息时,您会意识到另一种方法是让用户在字段中输入。将格式化程序连接到该字段以验证输入是否为有效数字,但它也能够将字符串转换为您的数字。并且当按下操作数时,该数字将作为操作数将对其进行操作的数字之一保留在一边。

      【讨论】:

      • 好的,谢谢。我会检查一下。由于我刚刚开始,可能有点先进,但我一定会看看!谢谢。
      • 您会经常使用格式化程序。现在了解它们可能需要更多的工作,但这是做你想做的事情的正确方法。而且,如果你编写了一些代码但它不起作用 - 你知道该去哪里吗?
      • 谢谢。我接受了这个答案,因为它比我通过反复试验编写的代码更能帮助我理解问题。当我更习惯代码时,我会研究格式化程序,这有点令人困惑。
      • 祝你好运。它确实变得更容易了,真的。第一个例子的问题是它们太做作了——只是为了让你习惯编写代码。
      【解决方案3】:
      -(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;
      
          }
      
      }
      

      【讨论】:

      • 你能提供一个小解释吗?
      【解决方案4】:

      您也可以使用扫描仪来解决这个问题。代码更简单,我认为它也本地化了。

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

      【讨论】:

        【解决方案5】:

        嘿,我想我有一个可行的简单解决方案 :)

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

        【讨论】:

        • 非常感谢!我现在想通了,但我的解决方案确实与您的相似。我花了一段时间来解决这个问题的整个想法。谢谢
        • 是的,我现在正在做作业的第 2 部分……当然要困难得多!
        • 也尝试这样做,但很难:(如果我有问题,你介意我发推给你吗?:)
        【解决方案6】:

        我看到它建议在我开始处理小数点后添加一个函数来处理小数点,并以这个结束。十进制标志在按下操作中被重置。并且要真正完成它,它可能也应该禁止前导 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;
            }
        }
        

        【讨论】:

          【解决方案7】:

          我发现我不需要使用 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;
              }
          }
          

          【讨论】:

          • 但代码必须只支持合法的浮点数。因此,如果您按 .两次它应该只输入一次。所以你应该使用 NSRange。
          【解决方案8】:

          我无法让上述任何代码与 CS193P 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
          

          【讨论】:

            【解决方案9】:

            我相信这更简单。

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

            【讨论】:

              【解决方案10】:

              这是我的第一个解决方案,看起来不像 Objective-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;
                  }
              }
              

              【讨论】:

                猜你喜欢
                • 2012-02-21
                • 2021-09-01
                • 1970-01-01
                • 1970-01-01
                • 2021-03-23
                • 2019-03-06
                • 1970-01-01
                • 2013-12-19
                • 1970-01-01
                相关资源
                最近更新 更多