【问题标题】:Append or Add the decimal point functionality in calculator在计算器中追加或添加小数点功能
【发布时间】:2014-04-19 16:28:56
【问题描述】:

我正在尝试将点功能添加到我的计算器中,但我一直在努力让它工作。

到目前为止,它所做的是添加小数点,但是当我按下另一个数字时,它所做的就是添加 0,而不管你按下的数字是什么......

示例:用户输入 9(点运算/十进制)然后 5 = 到 9.0

这当然是完全错误的。

最后,我专门发布了点函数和数字 9,它们是产生该答案的函数。

头文件..

int Method;
float SelectNumber;
float RunningTotal;
bool DecimalActived;

@interface ViewController : UIViewController{
    IBOutlet UILabel *Screen;
}

-(IBAction)Number9:(UIButton *)sender;
-(IBAction)Dot:(UIButton *)sender;  

@end

实施文件..(已更新)

-(IBAction)Number9:(UIButton *)sender{

    [self appendDigit:@"9"];

}

- (IBAction)Dot:(UIButton *)sender {

    NSString *currentText = Screen.text;
    if ([currentText rangeOfString:@"." options:NSBackwardsSearch].length == 0) {
        [self appendDigit:@"."];
    }

}

- (void)appendDigit:(NSString *)digit {
    // handle two special cases: append to only zero means just replace
    // but append decimal point to zero is a regular append
    if ([self->Screen.text isEqualToString:@"0"] && ![digit isEqual:@"."]) {
        self->Screen.text = digit;
    } else {
        self->Screen.text = [Screen.text stringByAppendingString:digit];
    }
}

计算(更新)

- (IBAction)Percent:(UIButton *)sender {

    [self MySwitch];

    Method = 5;
    SelectNumber = 0;
    DecimalActived = FALSE;
    Screen.text = [NSString stringWithFormat:@"%.2g", RunningTotal];

}


- (IBAction)PositiveOrNegative:(UIButton *)sender {

    [self MySwitch];

    Method = 6;
    SelectNumber = 0;
    DecimalActived = FALSE;
    Screen.text = [NSString stringWithFormat:@"%g", RunningTotal];

}


-(IBAction)Equals:(UIButton *)sender{

    [self MySwitch];

    Method = 0;
    SelectNumber = 0;
    DecimalActived = FALSE;
    Screen.text = [NSString stringWithFormat:@"%g", RunningTotal];

}


-(IBAction)AllClear:(UIButton *)sender{

    Method = 0;
    RunningTotal = 0;
    SelectNumber = 0;

    Screen.text = [NSString stringWithFormat:@"0"];

}

- (double) MySwitch {

     SelectNumber = [[NSNumberFormatter alloc] init];
     [SelectNumber setNumberStyle:NSNumberFormatterDecimalStyle];
     RunningTotal = [SelectNumber numberFromString:self->Screen.text];

     if (RunningTotal == 0) {
         RunningTotal = SelectNumber;
     } else{
        switch (Method) {
            case 1:
                RunningTotal = RunningTotal * SelectNumber;
                break;
            case 2:
                RunningTotal = RunningTotal / SelectNumber;
                break;
            case 3:
                RunningTotal = RunningTotal - SelectNumber;
                break;
            case 4:
                RunningTotal = RunningTotal + SelectNumber;
                break;
            case 5:
                RunningTotal = RunningTotal / 100;
                break;
            case 6:
                if(RunningTotal > 0){
                    RunningTotal = - RunningTotal;
                } else{
                    RunningTotal = + RunningTotal;
                }
                break;
            default:
                break;
        }
     }

    return RunningTotal;
}

如果你们需要更多对代码的参考,请告诉我,我们会提供它,或者在这方面有任何帮助的问题也请告诉我,我会提供信息:)

【问题讨论】:

    标签: ios objective-c calculator


    【解决方案1】:

    通过认识到输入的数值在您必须进行计算之前并不重要,可以简化问题。您可以让按钮和文本字段只关注文本行为,然后在需要时随时提取值。例如

    // do this for digits and @"."
    - (IBAction)button9:(id)sender {
        [self appendDigit:@"9"];
    }
    
    - (void)appendDigit:(NSString *)digit {
        // handle two special cases: append to only zero means just replace
        // but append decimal point to zero is a regular append
        if ([self.myTextField.text isEqualToString:@"0"] && ![digit isEqualToString:@"."]) {
            self.myTextField.text = digit;
        } else {
            self.myTextField.text = [myTextField.text stringByAppendingString:digit];
        }
    }
    
    // negative sign is special too...
    self.myTextField.text = [@"-" stringByAppendingString:myTextField.text];
    

    然后,只有稍后,当你需要进行计算时,你才能得到这样的数值:

    NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
    [f setNumberStyle:NSNumberFormatterDecimalStyle];
    NSNumber *number = [f numberFromString:self.myTextField.text];
    

    最后,另一个很好的表示模式是将数值状态保持为 NSNumbers,在需要数学时转换为标量类型...

    NSNumber *runningTotal;
    NSNumber *currentValue;
    
    // say the current operation is multiplication
    float runningTotalFloat = [runningTotal floatValue];
    float currentValueFloat = [currentValue floatValue];
    float newRunningTotal = runningTotalFloat * currentValueFloat;
    
    runningTotal = [NSNumber numberWithFloat: newRunningTotal];
    

    【讨论】:

    • 是的,这比我的回答简单得多
    • 我刚刚添加了我的计算功能。我应该将 RunningTotal 更改为数字吗?
    • 是的,您的计算器状态可以以数字形式保存(运行总数将是 NSNumber,最后输入的操作可以是 int 等)。关键是当前输入的数字的低级状态作为文本字段的文本更好地维护。
    • @danh 好的,谢谢。我现在看到的问题是在我按下一个数字后保持零..如果我按下 9 是 09..
    • 我明白你的意思。好的。我更新以处理一些特殊情况(并重构为一种方法,因此您不必为这些情况到处添加源代码行)。
    【解决方案2】:

    您应该让用户将号码输入NSMutableString,我们称之为buffer

    - (void)appendCharacter:(char)c
    {
        if(isdigit(c)) {
            [buffer appendFormat:@"%c", c];
        } else if(c == '.') {
            if([buffer rangeOfString:@"."].location != NSNotFound) {
                // user tried to add more than 1 decimal point
                BEEP();
            } else {
                [buffer appendString:@"."];
            }
        } else {
            // user writes some other character.
            // do whatever you like
        }
    }
    

    要获取浮点值,可以在缓冲区上调用 -floatValue。

    【讨论】:

    • 那么我应该在我的代码中将 SelectNumber 更改为 NSMutableString 吗?然后执行刚才为我的 Dot 函数展示的示例?
    • 这就是我的建议。或者,如果字符串已经在文本字段中,您可以将一个字符附加到文本字段中的字符串;当我想到它时,这可能更干净......
    猜你喜欢
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 2017-06-03
    • 2017-01-14
    相关资源
    最近更新 更多