zoukankan      html  css  js  c++  java
  • 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];
    }
     
  • 相关阅读:
    linux ftp启用和停用及vsftpd安装 ssh 启用和停用命令及ssh的安装
    linux 网络命令
    printf的使用
    Shell echo命令
    shell脚本之文件操作
    shell脚本之字符串运算的使用
    linux的计划任务操作
    系统操作有关的命令
    shell脚本之 operater.sh 算术运算符;比较运算符;布尔运算符;逻辑与或非运算符;字符串运算符的使用
    shell脚本的参数传递使用
  • 原文地址:https://www.cnblogs.com/L-vincen/p/6879820.html
Copyright © 2011-2022 走看看