在计算器中附加或添加小数点function

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

到目前为止它所做的就是添加小数点,但是当我按下另一个数字时,它所做的就是加0,而不pipe你按下的是多less。

例如:用户input9(点操作/十进制),然后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; } 

如果你们需要更多的参考代码请让我知道,并将提供它或任何问题,在这方面的帮助,让我也知道,我会提供的信息:)

这个问题可以通过认识到input的数值不重要,直到你必须做一个计算来简化。 您可以让button和文本字段只关注文本行为,然后在您需要的时候提取值。 例如

 // 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,当需要math时转换为标量types。

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

你应该让用户input一个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。