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

时间:2011-06-18 12:29:21

标签: objective-c ios floating-point cs193p

我最近开始在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然后浮点数{ {1}}所以我最终得到3。然后我设法为剩下的输入“禁用”浮点数。但是我想我对它有点过于严格:例如,我不能放入5.3但是在按下一个操作之后按钮(5.3.2等),它仍然不会让我按下浮点按钮。我想我应该重置我用过的bool?

我不是在寻找一个完全写出来的解决方案,但有人可以如此善意地提供一些关于如何解决这个问题的基本建议吗?在不实际提供代码解决方案的情况下,对我应该做什么和思考的一些逐步概述。

提前致谢。

10 个答案:

答案 0 :(得分:5)

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

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

    }

}

答案 1 :(得分:2)

由于您需要提示要查看的位置,请查看将NSNumberFormatter附加到输入字段。

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

修改 我刚刚阅读了您正在努力完成的任务。我认为我的答案虽然仍然是正确的方法,但不是最好的方法来完成任务试图让你做的事情。

由于您正在逐个阅读数字,因为它们被添加到视图中并将它们附加到您正在操作的数字上,因此您可能会使用原始答案进入正确的轨道:

  • 继续接受添加的号码
  • 添加decimalEntered标记 - 将其初始化为“NO”
  • 如果输入小数,请检查标志,如果为否,则接受该标志并将标志设置为YES
  • 如果输入小数且标志为YES,则不接受。
  • 每当您按操作数时,请将此标志设置回NO。

当你学到更多东西时,你会发现另一种方法是让用户输入字段。将格式化程序连接到字段以验证输入是有效数字,但它也可以将字符串转换为数字。当按下操作数时,该数字将被保留为操作数将在其上运行的数字之一。

答案 2 :(得分:2)

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

    }

}

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

我相信这更简单。

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

}

答案 6 :(得分:1)

我看到它建议在我开始使用该位之后添加一个处理小数的函数,并最终得到这个。按下操作时重置十进制标志。并且要真正完成它,它应该也可能不允许领先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 :(得分:1)

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

答案 8 :(得分:1)

我无法获得上述任何代码来使用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 :(得分:1)

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