iOS 收款计算器算法

一个收款计算器算法,从之前高仿有赞Demo里面抽离的一个界面

demo 在这里 https://github.com/L-vinCent/calculView_function

  • 显示计算记录
  • 不能连续输入俩个计算符号
  • 小数点的位数不能超过俩位
  • 单个小数点的时候不能输入 00
  • 点击 + ,直接显示计算结果,正则匹配计算
  • 设置最大显示金额
- (IBAction)calculate:(UIButton *)sender {

    UIButton *btn=(UIButton *)sender;

    NSArray *firstArr=@[@"00",@"+",@".",@"",@"0"];  //首字母输入要忽略的字符

    NSArray *LastArr=@[@"+",@"."];  //不同连续输入的字符

    NSArray *zeroArr=@[@"+",@""];  // 在.00之后可以点击的字符

    if (historyStr.length>=3) {
     //x.00 之后不能再输入数字
        NSString *dot=[historyStr substringWithRange:NSMakeRange(historyStr.length-3, 1)];

        if ([dot isEqualToString:@"."]&&![zeroArr containsObject:btn.titleLabel.text]&&![[historyStr substringWithRange:NSMakeRange(historyStr.length-1, 1)] isEqualToString:@"+"]) {

            return;
        }

        NSLog(@"------%@",dot);
    }


    if (historyStr.length>=2) {
        NSString *dot=[historyStr substringWithRange:NSMakeRange(historyStr.length-2, 1)];
        if ([dot isEqualToString:@"."]&&[btn.titleLabel.text isEqualToString:@"00"]) {
            return;
        }

    }


    if (historyStr.length==0) {
        //首字符
        if([firstArr containsObject:btn.titleLabel.text]){
            return;
        }

    }else{

        if ([LastArr containsObject:[historyStr substringFromIndex:historyStr.length-1]]) {

            if ([LastArr containsObject:btn.titleLabel.text]) {

                return;
            }

        }


    }

        if ([btn.titleLabel.text isEqualToString:@"收款"]) {
            //处理收款按钮事件
            if (self.block) {

                self.block(_calculatePanel.text.floatValue);

            }
            return;

        }


    //处理清除按钮事件
    if ([btn.titleLabel.text isEqualToString:@""]) {

        if (historyStr.length>0) {

        //清除原来的数字,重新输入
            NSRange deleteRange = { [historyStr length] - 1, 1 };
            [historyStr deleteCharactersInRange:deleteRange];

            _historyLabel.text=historyStr;

            NSString *result=[self calculatePattern:[self scanPattern:historyStr]];

            _calculatePanel.text=[NSString stringWithFormat:@"%.2f",[result floatValue]];
            moneyLabel.text=[NSString stringWithFormat:@"应收金额: ¥%.2f",[result floatValue]];

            if (historyStr.length==0) {
                _historyLabel.text =@"";
            }

        }else
        {
        //在为0的时候继续按清除键

            _historyLabel.text =@"";
            _calculatePanel.text=@"0.00";
            moneyLabel.text=kNorMoneyLabelStr;

        }

        return;
    }


    if (_calculatePanel.text.floatValue>=300000) {
        _calculatePanel.text=@"300000.00";
        moneyLabel.text=@"应收金额: 300000.00";
         _historyLabel.text=@"300000";
        historyStr=@"300000".mutableCopy;
        [PPHUDHelp showMessage:@"最高金额不能超过30w"];
        return;
    }

//    NSString *moneyStr=[NSString stringWithFormat:@"%.2f",sender.titleLabel.text.floatValue];

    [historyStr appendString:sender.titleLabel.text];
    _historyLabel.text=[historyStr copy];

    NSString *result=[self calculatePattern:[self scanPattern:historyStr]];


    _calculatePanel.text=[NSString stringWithFormat:@"%.2f",[result floatValue]];
    moneyLabel.text=[NSString stringWithFormat:@"应收金额: ¥%.2f",[result floatValue]];


}
-(NSArray *)scanPattern:(NSString *)pattern {
    NSUInteger header = 0;
    NSMutableString *middleData = [NSMutableString stringWithFormat:@""];
    NSMutableArray *middleArray = [NSMutableArray array];

    for (; header < pattern.length; header++) {
        unichar letter = [pattern characterAtIndex:header];
//        NSLog(@"%d", letter);
        if ((letter >= 48 && letter <= 57) || letter == 46) {
            char ch = (char)letter;
            [middleData appendFormat:@"%c", ch];
        }else {
            if ([middleData length] <= 0) {
                _error = YES;
                break;
            }
            [middleArray addObject:[middleData copy]];
            char ch = (char)letter;
            NSString *character = [NSString stringWithFormat:@"%c", ch];

            BOOL isHighLevel = (ch == '/' || ch == '*' || ch == '%');

            if([_operators count] == 0) {
                [_operators addObject:character];
            } else if(isHighLevel && ([[_operators lastObject] isEqualToString:@"+"] || [[_operators lastObject] isEqualToString:@"-"])) {
                [_operators addObject:character];
            }else {
                [middleData appendString:[_operators lastObject]];
                [middleArray addObject:[_operators lastObject]];
                [_operators removeLastObject];
                [_operators addObject:character];
            }
            NSRange range = NSMakeRange(0, [middleData length]);
            [middleData deleteCharactersInRange:range];
        }
    }
    [middleArray addObject:[middleData copy]];

    while ([_operators count]) {
        [middleArray addObject:[_operators lastObject]];
        [_operators removeLastObject];
    }
    return [middleArray copy];
}
- (NSString *)calculatePattern:(NSArray *)pattern {

    //    Stack<Double> intStack = new Stack<Double>();
    NSMutableArray *intStack = [NSMutableArray array];
    double result=0;

    for (int i = 0; i < [pattern count]; i++) {
        NSString *letter = pattern[i];
//        NSLog(@"%@", letter);
        NSString *string = [letter stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]];

        if (string.length == 0 || [string containsString:@"."]) {
            NSNumber *number = [NSNumber numberWithDouble:[letter doubleValue]];
            [intStack addObject:number];
        } else {
            NSNumber *topNum = [intStack lastObject];
            [intStack removeLastObject];

            NSNumber *secondNum = [intStack lastObject];
            [intStack removeLastObject];

            double top = [topNum doubleValue];
            double second = [secondNum doubleValue];

            switch([pattern[i] characterAtIndex:0])
            {
                case '*':
                    result = top * second;
                    break;
                case '/':
                    result = second / top;
                    break;
                case '+':
                    result = top + second;
                    break;
                case '-':
                    result = second - top;
                    break;
            }
            [intStack addObject:[NSNumber numberWithDouble:result]];
        }
    }
    NSNumber *finalResult = [intStack lastObject];
    [intStack removeLastObject];

    return [NSString stringWithFormat:@"%@", finalResult];
}
 
原文地址:https://www.cnblogs.com/L-vincen/p/6879820.html