gpt4 book ai didi

带小数点的 iOS 7 计算器应用程序

转载 作者:行者123 更新时间:2023-11-29 10:36:17 25 4
gpt4 key购买 nike

OK 这是我的代码

它现在将用户输入限制为小数点后两个字符并检查小数点,但现在它不再让我添加或减去....../叹气

//
// CalculatorViewController.h
//
//


#import "ViewController.h"

int Method;
long int SelectNumber;
float RunningTotal;


@interface CalculatorViewController : ViewController <UITextFieldDelegate>

@property (strong, nonatomic) IBOutlet UILabel *screen;

- (IBAction)backToMainViewFromCalculatorViewButton:(id)sender;


@end

和我的.m

//
// CalculatorViewController.m
//
//


#import "CalculatorViewController.h"
BOOL isDecimal;
float resultNumber;
float displayNumber;
int operation;

NSUInteger decimalPlacesLimit = 2;


@interface CalculatorViewController ()

@end

@implementation CalculatorViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.

// self.screen.text = @"";
isDecimal = false;
resultNumber = 0;
self.screen.adjustsFontSizeToFitWidth = TRUE;
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/

- (IBAction)backToMainViewFromCalculatorViewButton:(id)sender {

// Dismiss the VIEW
// DO NOT SEGUE back
// DO THIS
//Going back using segue just stacks views and then soon you run out of memory and APP crashes
[self dismissViewControllerAnimated:YES completion:NULL];
}

-(void)setResultWithNumber:(int)theNumber{

if(!isDecimal){
displayNumber *= 10;
displayNumber += theNumber;
self.screen.text = [NSString stringWithFormat:@"%.0f", displayNumber];
}
else
{
self.screen.text = [self.screen.text stringByAppendingString:[NSString stringWithFormat:@"%d", theNumber]];
}
displayNumber = [self.screen.text floatValue];
}

-(void)operationWithNumber:(int)theNumber{

isDecimal = false;

if(resultNumber == 0){
resultNumber = displayNumber;
}
else{
self.screen.text = [NSString stringWithFormat:@"%.2f",resultNumber];
switch (operation) {
case 1:
resultNumber += displayNumber;
break;
case 2:
resultNumber -= displayNumber;
break;
case 3:
resultNumber = displayNumber*resultNumber;
break;
case 4:
resultNumber /= displayNumber;
break;

default:
break;
}
}
operation = theNumber;
displayNumber = 0;

}
- (IBAction)AC:(id)sender {
operation = 0;
resultNumber = 0;
displayNumber = 0;
isDecimal = false;
self.screen.text = [NSString stringWithFormat:@"%i",0];

}
/*
- (IBAction)plus_minus:(id)sender {

displayNumber = 0 - displayNumber;
if(isDecimal)
result.text = [NSString stringWithFormat:@"%.2f", displayNumber];
else
result.text = [NSString stringWithFormat:@"%.0f", displayNumber];

}

- (IBAction)divide:(id)sender {
if(resultNumber != 0){
[self operationWithNumber:operation];
result.text = [NSString stringWithFormat:@"%.2f",resultNumber];
displayNumber = [result.text floatValue];
resultNumber = 0;
}
[self operationWithNumber:4];


}
*/
- (IBAction)seven:(id)sender
{
NSRange range = [self.screen.text rangeOfString:@"."];

// Search for a Period
// If not found append one to the text
if (range.location == NSNotFound)
{
[self setResultWithNumber:7];
isDecimal = false;
}
else
{
// If we allready ahve a character move on to test for .
NSArray *explodedString = [self.screen.text componentsSeparatedByString:@"."];
NSString *decimalPart = explodedString[1];

if (decimalPart.length >= decimalPlacesLimit && ![self.screen.text isEqualToString:@""])
{
NSLog(@"textField already contains %lu decimal places", (unsigned long)decimalPlacesLimit);
isDecimal = true;

}
else
{
isDecimal = false;
[self setResultWithNumber:7];
}
}
}
- (IBAction)eight:(id)sender
{

NSRange range = [self.screen.text rangeOfString:@"."];

// Search for a Period
// If not found append one to the text
if (range.location == NSNotFound)
{
[self setResultWithNumber:8];
}
else
{
// If we allready ahve a character move on to test for .
NSArray *explodedString = [self.screen.text componentsSeparatedByString:@"."];
NSString *decimalPart = explodedString[1];

if (decimalPart.length >= decimalPlacesLimit && ![self.screen.text isEqualToString:@""])
{
NSLog(@"textField already contains %lu decimal places", (unsigned long)decimalPlacesLimit);
isDecimal = true;
}
else
{
[self setResultWithNumber:8];
}
}
}
- (IBAction)nine:(id)sender
{

NSRange range = [self.screen.text rangeOfString:@"."];

// Search for a Period
// If not found append one to the text
if (range.location == NSNotFound)
{
[self setResultWithNumber:9];
}
else
{
// If we allready ahve a character move on to test for .
NSArray *explodedString = [self.screen.text componentsSeparatedByString:@"."];
NSString *decimalPart = explodedString[1];

if (decimalPart.length >= decimalPlacesLimit && ![self.screen.text isEqualToString:@""])
{
NSLog(@"textField already contains %lu decimal places", (unsigned long)decimalPlacesLimit);
isDecimal = true;
}
else
{
[self setResultWithNumber:9];
}
}
}
/*
- (IBAction)multiply:(id)sender {
if(resultNumber != 0){
[self operationWithNumber:operation];
result.text = [NSString stringWithFormat:@"%.2f",resultNumber];
displayNumber = [result.text floatValue];
resultNumber = 0;
}
[self operationWithNumber:3];
}
*/
- (IBAction)six:(id)sender
{
NSRange range = [self.screen.text rangeOfString:@"."];

// Search for a Period
// If not found append one to the text
if (range.location == NSNotFound)
{
[self setResultWithNumber:6];
}
else
{
// If we allready ahve a character move on to test for .
NSArray *explodedString = [self.screen.text componentsSeparatedByString:@"."];
NSString *decimalPart = explodedString[1];

if (decimalPart.length >= decimalPlacesLimit && ![self.screen.text isEqualToString:@""])
{
NSLog(@"textField already contains %lu decimal places", (unsigned long)decimalPlacesLimit);
isDecimal = true;
}
else
{
[self setResultWithNumber:6];
}
}
}
- (IBAction)five:(id)sender
{

NSRange range = [self.screen.text rangeOfString:@"."];

// Search for a Period
// If not found append one to the text
if (range.location == NSNotFound)
{
[self setResultWithNumber:5];
}
else
{
// If we allready ahve a character move on to test for .
NSArray *explodedString = [self.screen.text componentsSeparatedByString:@"."];
NSString *decimalPart = explodedString[1];

if (decimalPart.length >= decimalPlacesLimit && ![self.screen.text isEqualToString:@""])
{
NSLog(@"textField already contains %lu decimal places", (unsigned long)decimalPlacesLimit);
isDecimal = true;
}
else
{
[self setResultWithNumber:5];
}
}
}
- (IBAction)four:(id)sender
{

NSRange range = [self.screen.text rangeOfString:@"."];

// Search for a Period
// If not found append one to the text
if (range.location == NSNotFound)
{
[self setResultWithNumber:4];
}
else
{
// If we allready ahve a character move on to test for .
NSArray *explodedString = [self.screen.text componentsSeparatedByString:@"."];
NSString *decimalPart = explodedString[1];

if (decimalPart.length >= decimalPlacesLimit && ![self.screen.text isEqualToString:@""])
{
NSLog(@"textField already contains %lu decimal places", (unsigned long)decimalPlacesLimit);
isDecimal = true;
}
else
{
[self setResultWithNumber:4];
}
}
}
- (IBAction)substract:(id)sender {
if(resultNumber != 0){
[self operationWithNumber:operation];
self.screen.text = [NSString stringWithFormat:@"%.2f",resultNumber];
displayNumber = [self.screen.text floatValue];
resultNumber = 0;
}
[self operationWithNumber:2];

}
- (IBAction)three:(id)sender
{

NSRange range = [self.screen.text rangeOfString:@"."];

// Search for a Period
// If not found append one to the text
if (range.location == NSNotFound)
{
[self setResultWithNumber:3];
}
else
{
// If we allready ahve a character move on to test for .
NSArray *explodedString = [self.screen.text componentsSeparatedByString:@"."];
NSString *decimalPart = explodedString[1];

if (decimalPart.length >= decimalPlacesLimit && ![self.screen.text isEqualToString:@""])
{
NSLog(@"textField already contains %lu decimal places", (unsigned long)decimalPlacesLimit);
isDecimal = true;
}
else
{
[self setResultWithNumber:3];
}
}
}

- (IBAction)two:(id)sender
{

NSRange range = [self.screen.text rangeOfString:@"."];

// Search for a Period
// If not found append one to the text
if (range.location == NSNotFound)
{
[self setResultWithNumber:2];
}
else
{
// If we allready ahve a character move on to test for .
NSArray *explodedString = [self.screen.text componentsSeparatedByString:@"."];
NSString *decimalPart = explodedString[1];

if (decimalPart.length >= decimalPlacesLimit && ![self.screen.text isEqualToString:@""])
{
NSLog(@"textField already contains %lu decimal places", (unsigned long)decimalPlacesLimit);
isDecimal = true;
}
else
{
[self setResultWithNumber:2];
}
}
}
- (IBAction)one:(id)sender
{

NSRange range = [self.screen.text rangeOfString:@"."];

// Search for a Period
if (range.location == NSNotFound)
{
// No period found
isDecimal = false;
// set the number
[self setResultWithNumber:1];
}
else
{
// If we allready have a character move on to test for .
NSArray *explodedString = [self.screen.text componentsSeparatedByString:@"."];
NSString *decimalPart = explodedString[1];

if (decimalPart.length >= decimalPlacesLimit && ![self.screen.text isEqualToString:@""])
{
NSLog(@"textField already contains %lu decimal places", (unsigned long)decimalPlacesLimit);
isDecimal = true;
}
else
{
[self setResultWithNumber:1];
}
}}


- (IBAction)add:(id)sender {
if(resultNumber != 0)
{
[self operationWithNumber:operation];
self.screen.text = [NSString stringWithFormat:@"%.2f",resultNumber];
displayNumber = [self.screen.text floatValue];
resultNumber = 0;
}
[self operationWithNumber:1];
}

- (IBAction)zero:(id)sender
{

NSRange range = [self.screen.text rangeOfString:@"."];

// Search for a Period
// If not found append one to the text
if (range.location == NSNotFound)
{
[self setResultWithNumber:0];
}
else
{
// If we allready ahve a character move on to test for .
NSArray *explodedString = [self.screen.text componentsSeparatedByString:@"."];
NSString *decimalPart = explodedString[1];

if (decimalPart.length >= decimalPlacesLimit && ![self.screen.text isEqualToString:@""])
{
NSLog(@"textField already contains %lu decimal places", (unsigned long)decimalPlacesLimit);
isDecimal = true;
}
else
{
[self setResultWithNumber:0];
}
}
}


- (IBAction)dot:(id)sender {

isDecimal = true;
NSRange range = [self.screen.text rangeOfString:@"."];

// Search for a Period
// If not found append one to the text
if (range.location == NSNotFound)
{
self.screen.text = [self.screen.text stringByAppendingString:@"."];
}
// We must have a period so now lets test for how many places after the decimal
// and limit it to two



// NSLog(@"text on the way: %@", string);


/*
NSUInteger decimalPlacesLimit = 2;

NSRange rangeDot = [self.screen.text rangeOfString:@"." options:NSCaseInsensitiveSearch];
NSRange rangeComma = [self.screen.text rangeOfString:@"," options:NSCaseInsensitiveSearch];
if (rangeDot.length > 0 || rangeComma.length > 0)
{
if([self.screen.text isEqualToString:@"."])
{
NSLog(@"textField already contains a separator");
}
else
{
NSArray *explodedString = [self.screen.text componentsSeparatedByString:@"."];
NSString *decimalPart = explodedString[1];

if (decimalPart.length >= decimalPlacesLimit && ![self.screen.text isEqualToString:@""])
{
NSLog(@"textField already contains %lu decimal places", (unsigned long)decimalPlacesLimit);
}
}
}
*/
}




- (IBAction)equals:(id)sender {
[self operationWithNumber:operation];
self.screen.text = [NSString stringWithFormat:@"%.2f",resultNumber];
displayNumber = [self.screen.text floatValue];
resultNumber = 0;

}



- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSLog(@"text on the way: %@", string);
NSUInteger decimalPlacesLimit = 2;

NSRange rangeDot = [textField.text rangeOfString:@"." options:NSCaseInsensitiveSearch];
NSRange rangeComma = [textField.text rangeOfString:@"," options:NSCaseInsensitiveSearch];
if (rangeDot.length > 0 || rangeComma.length > 0){
if([string isEqualToString:@"."]) {
NSLog(@"textField already contains a separator");
return NO;
} else {
NSArray *explodedString = [textField.text componentsSeparatedByString:@"."];
NSString *decimalPart = explodedString[1];
if (decimalPart.length >= decimalPlacesLimit && ![string isEqualToString:@""]) {
NSLog(@"textField already contains %lu decimal places", (unsigned long)decimalPlacesLimit);
return NO;
}
}
}

return YES;
}

@end

我无法弄清楚如何确保我检查小数点然后将条目限制在小数点后不超过两位并且仍然能够计算

任何帮助将不胜感激

特拉维斯

最佳答案

我之前构建了一个计算器应用程序。我所做的是:
使用tag来标识不同的按钮,0代表按钮0,1代表按钮1……99代表按钮点。所有这些按钮都触发了相同的 IBAction 函数,在这个函数中只检查用户按下的按钮是否可以添加到 Label (你可以在这里使用 UILabel 而不是 UITextField ) 通过应用您在上面创建的规则。试试这个代码:

// Assume that, the number buttons have tags from 0 - 9 respectively, and dot button has tag 99
- (IBAction)onButtonPressed:(UIButton *)sender
{
NSRange range = [self.screen.text rangeOfString:@"."];

BOOL canUpdateScreen = YES;
if(range.location != NSNotFound) {
if(sender.tag == 99) {
// Already got dot, cannot show another dot
canUpdateScreen = NO;
} else {
NSArray *explodedString = [self.screen.text componentsSeparatedByString:@"."];
if(explodedString[1].length >= decimalPlacesLimit) {
canUpdateScreen = NO;
}
}
}

if(canUpdateScreen) {
if(sender.tag == 99) {
self.screen.text = [NSString stringWithFormat:@"%@%@", self.screen.text, @"."];
} else {
self.screen.text = [NSString stringWithFormat:@"%@%d", self.screen.text, sender.tag];
}
}
}

关于带小数点的 iOS 7 计算器应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26900802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com