【问题标题】:ios 7 calculator app with decimal pointios 7 带小数点的计算器应用程序
【发布时间】:2015-01-10 02:54:58
【问题描述】:

好的,这是我的代码

它现在将用户输入限制为小数点后的两个字符并检查小数点,但现在它不再允许我加减...... /sigh

//
//  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

我不知道如何确保我检查小数点,然后将条目限制在小数点后不超过两位,但仍然能够计算

任何帮助将不胜感激

特拉维斯

【问题讨论】:

    标签: ios uitextfield calculator


    【解决方案1】:

    我之前构建了一个计算器应用程序。我所做的是:
    使用标签来标识不同的按钮,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];
            }
        }
    }
    

    【讨论】:

    • 查看我的代码,一个IBAction就够了,不需要每个按钮都有IBAction。
    • 如果我不使用标签,我将如何调整这一点,我使用数字 0 - 9 的 IBAction 按钮并说一个加号和减号 IBAction 按钮
    • 只需设置每个按钮的tag 属性,如button.tag = 1
    • 好的,我会看看这是否有效。你的代码也有版权吗?如果我想制作一个计算器应用程序在应用商店销售,我可以在我的应用程序中使用它吗?
    • 没关系,你可以用它
    【解决方案2】:

    这里

    -(IBAction)NUmber1:(id)sender{
    
        SelectNumber = SelectNumber * 10;
        SelectNumber = SelectNumber + 1;
        Screen.text = [NSString stringWithFormat:@"%i", SelectNumber];
    }
    you are erasing your current string with new INTEGER value. Try to change to
    
    -(IBAction)NUmber1:(id)sender{
        Screen.text = [Screen.text stringByAppendingString:@"1"];
    }
    

    您还需要更改 SelectNumber 计算逻辑。我建议你在真正需要的时候从字符串中获取它

    double SelectNumber = [Screen.text doubleValue];
    

    【讨论】:

    • 抱歉,我的问题可能不清楚。我显示的代码可以查看是否有小数点,如果您在已经拥有小数点后尝试输入小数点,它不会让您输入。当我使用带有按钮的 IBAction 而不是单击文本字段时弹出的文本字段键盘时,如何检查一个句点并且不让用户输入另一个句点。
    • 这是我更改的代码,如果小数点存在,则尝试让小数点不被允许,并尝试只允许小数点后 2 位
    【解决方案3】:

    问题

    您发布的代码是,UITextFieldDelegate 方法实现。如果您通过代码更新 UITextField 文本,则不会触发。

    解决方案

    您可以使用以下任何一种解决方案。

    为了简化任务,您可以使用标记 0 到 9 来表示按钮 0 到 9,并使用其他值来表示“。”和“,”在另一个答案中提到。

    // 1. Call the method (in your code) on tapping the buttons (0 - 9 and “.”) and conditionally update the UITextField.text (yourTextField.text), like
    
        update = [self textField:yourTextField shouldChangeCharactersInRange:NSMakeRange(yourTextField.text.length, 1) replacementString:yourButtonLabel];
    
        if (update)
        {
            // Uodate yourTextField
        }
        else
        {
            // Don’t update yourTextField
        }
    
    // 2. Before updating yourTextField.text, check there is any decimal point or comma already in yourTextField, using
    
        if([yourTextField.text rangeOfString:@"."].location != NSNotFound) // Update condition to check comma if the tapped button is so
        {
            // Don’t update yourTextField
        }
        else
        {
            // Update yourTextField
        }
    

    【讨论】:

    • 我如何发布新代码以便您看到我目前拥有的内容?
    • 按照以下步骤操作:1.将 UITextField 添加到您的 XIB; 2.增加15个按钮0到9和小数点,+,x,-,/,=; 3.为按钮0至9设置标签0至9,为小数点设置标签10,为操作员设置标签11-15; 4.为UITextField(displayField)设置IBOutlet; 5.将单个 IBAction(比如 -(IBAction)numberButtonTapped:(id)sender) 设置为按钮 0-9; 6.为小数点设置 IBAction(比如 -(IBAction)decimalButtonTapped:(id)sender);7.将单个 IBAction(比如 -(IBAction)operatorButtonTapped:(id)sender)设置为按钮 +,x,-,/,= ;
    • 下面是标签: 0 到 9 用于标记为 0 - 9 的按钮; 10 表示小数点; 11 表示 +; 12 代表 -; 13 代表 X; 14 代表 /; 15 代表 =;
    • 要发布您的代码,您可以编辑您的答案或作为答案发布
    • - (IBAction)numberButtonTapped:(id)sender{displayField.text = [NSString stringWithFormat:@"%@%d", displayField.text, [sender tag]];} - (IBAction) decimalButtonTapped:(id)sender{if ([displayField.text rangeOfString:@"."].location != NSNotFound){displayField.text = [NSString stringWithFormat:@"%@.", displayField.text];}}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多