7

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

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

您的计算器已经可以处理浮点数(例如,如果您按 3 / 4 = 它将正确显示结果值 0.75),但是,用户无法输入浮点数。补救这个。只允许输入合法的浮点数(例如“192.168.0.1”不是合法的浮点数)。

首先,我不确定浮点数是否算作digitPressedoperationPressed。我什至尝试了一种名为的新方法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但在按下操作按钮(+等)之后,它仍然不会让我按下浮点按钮。我想我应该重置我用于此的布尔值?

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

提前致谢。

4

10 回答 10

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;

    }

}
于 2011-06-18T13:50:33.810 回答
2

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

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

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

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

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

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

于 2011-06-18T13:54:47.310 回答
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;

    }

}
于 2012-09-23T21:29:22.363 回答
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;
}
于 2011-07-22T20:26:47.157 回答
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;
    }
}
于 2011-07-26T15:59:40.800 回答
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;
}

}
于 2011-10-14T03:40:07.610 回答
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;
    }
}
于 2011-12-03T20:48:55.480 回答
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;
    }
}
于 2012-01-05T00:43:38.203 回答
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
于 2012-02-05T00:09:53.313 回答
1

这是我的第一个解决方案,看起来不像 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-03-04T09:57:24.060 回答