iOS 收款計算器算法

一個收款計算器算法,從以前高仿有贊Demo裏面抽離的一個界面git

demo 在這裏 https://github.com/L-vinCent/calculView_functiongithub

  • 顯示計算記錄
  • 不能連續輸入倆個計算符號
  • 小數點的位數不能超過倆位
  • 單個小數點的時候不能輸入 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];
}
相關文章
相關標籤/搜索