【问题标题】:Doing calculations with NSNumbers in a calculator?在计算器中使用 NSNumbers 进行计算?
【发布时间】:2014-04-19 20:30:54
【问题描述】:

我正在尝试使用 NSNumbers 进行计算并跟踪用户输入的数字..

问题是我的应用程序在将我的代码更新为 append 后现在没有进行任何计算。用户按下点按钮时的十进制值。可以找到Append or Add the decimal point functionality in calculator

我已经看到跟踪用户输入并进行计算的正确方法是使用 NSNumber,但由于我对 Objective-c 非常陌生,我一直在努力理解其使用和实现它。

所以,希望有人可以指导我找到合适的解决方案。

这是标题...

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 {

     NSNumberFormatter SelectNumber = [[NSNumberFormatter alloc] init];
     [SelectNumber setNumberStyle:NSNumberFormatterDecimalStyle];
     NSNumber 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;
}

如果你们对我的计划有任何疑问或需要更多信息,请随时提出,我会提供尽可能多的信息或回答你们可能有的任何问题.. :)

【问题讨论】:

  • 这和NSNumber有什么关系?你的代码都没有使用NSNumber
  • 对不起,我错过了在 MySwitch 函数上添加类型,我刚刚做了..
  • 您遇到的具体问题是什么?这不是指导或交互式调试的地方。
  • 在您的NSNumber 对象上使用doubleValue 以获得double。然后您可以使用double 进行数学运算。
  • 是的,但是我如何获得用户已经输入的内容?示例 12 然后调用操作 + 然后再次调用 12.. 那么,我应该创建一个本地 NSString 变量来获取用户第一次输入的任何内容吗?

标签: ios objective-c cocoa-touch ios7 calculator


【解决方案1】:

标题应该更像这样:

// this uses more conventional (lowercase) property names
// and removes a couple that looked extraneous
@interface ViewController : UIViewController
@property(strong,nonatomic) IBOutlet UILabel *screen;
@property(assign,nonatomic) NSInteger method;
@property(strong,nonatomic) NSNumber *runningTotal;
@end

当用户按下数字、小数、减号时,将其附加到 screen 标签上。当用户按下操作按钮时,为操作记录一个整数,并记录screen标签的当前(NSNumber)值。进行计算...

- (void)doComputation {

    float screenF = [[self screenValue] floatValue];
    float runningF = [self.runningTotal floatValue];
    float result;

    switch (self.method) {
        case 1:
            result = runningF * screenF;
            break;
        case 2:
            result = (screenF == 0.0)? 0.0 : runningF / screenF;
            break;
        case 3:
            result = runningF - screenF;
            break;
        case 4:
            result = runningF + screenF;
            break;
        default:
            break;
    }
    self.screen.text = [NSString stringWithFormat:@"%0.8f", result];
    self.runningTotal = [NSNumber numberWithFloat:result];
}

(屏幕值,如你所愿......)

- (NSNumber *)screenValue {
    NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
    [f setNumberStyle:NSNumberFormatterDecimalStyle];
    return [f numberFromString:self.screen.text];
}

【讨论】:

  • 我尝试过使用您的解决方案,但结果完全错误。不确定您是否看到我的计划是先输入一个数字,例如 10,然后在操作时输入一个数字 (*)按下屏幕上的文本是清晰的,用户输入第二个输入让我们说 2 然后它必须按下等号按钮以显示操作结果..这没有发生.. :(
【解决方案2】:

这是如何工作的?

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

 if (RunningTotal == 0) {
     RunningTotal = SelectNumber;
 } else{
    switch (Method) {
        case 1:
            RunningTotal = RunningTotal * SelectNumber;
            break;

这段代码甚至不应该工作。 SelectNumber 是浮点数或者是 NSNumberFormatter*

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    相关资源
    最近更新 更多