CS193P-向iOS计算器添加浮点按钮

问题描述

| 我最近开始在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
。然后我设法“禁用”了输入的其余部分的浮点数。但是我想我对此有点太严格了:例如,我不能放入ѭ7,但是按下操作按钮后(
+
等),它仍然不允许我按浮点按钮。我想我应该重置用于此的布尔值? 我不是在这里寻找一个完全书面的解决方案,但是有人可以提供一些有关如何解决此问题的基本建议吗?在没有实际提供代码解决方案的情况下,对我应该做的事情和考虑的步骤进行了逐步的概述。 提前致谢。     

解决方法

        由于您想提示要看的地方,因此请看如何将NSNumberFormatter附加到输入字段。 这是验证输入的正确方法,而不是手动检查用户输入的每个字符。 编辑 我刚刚阅读了您要尝试完成的作业。我认为我的回答虽然仍然是正确的方法,但不是完成任务试图让您完成任务的最佳方法。 由于您是在将数字添加到视图中并将它们附加到要操作的数字上时,一一阅读它们,因此您可能会在正确的位置找到原始答案: 在添加数字时继续接受数字 添加一个
decimalEntered
标志-将其初始化为\'NO \' 如果输入了十进制,请检查标志,如果不是,则接受它并将标志设置为“是” 如果输入了十进制且标志为是,则不接受。 每当您按下操作数时,将此标志设置回NO。 当您学到更多时,您会意识到另一种方法是让用户在字段中键入。将格式化程序连接到该字段以验证输入是否为有效数字,但是它也将能够为您将字符串转换为数字。当按下操作数时,该数字将保留为该操作数将在其上进行操作的数字之一。     ,        好的。我解决了一旦我设法将脑袋包起来,这相当容易:
-(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;

    }

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

    }

}
    ,        您也可以使用扫描仪解决此问题。该代码更简单,我认为它也已本地化。
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;
}
    ,        嘿,我想我有一个可行的简单解决方案:)
- (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;
    }
}
    ,        我看到它建议添加一个函数以在我从该位开始并以此结束后处理小数。按下操作时,十进制标志将复位。并且要真正完成它,它可能也应该不允许前导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;
    }
}
    ,        我发现我不需要使用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;
    }
}
    ,        我无法将以上任何代码与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
    ,        我相信这比较简单。
- (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;
}

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