加入收藏 | 设为首页 | 会员中心 | 我要投稿 52刷机网 (https://www.52shuaji.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 苹果频道 > 苹果资讯 > 正文

iOS 收款计算器算法

发布时间:2017-05-19 23:32:30 所属栏目:苹果资讯 来源:www.jianshu.com
导读:一个收款计算器算法,从之前高仿有赞Demo里面抽离的一个界面demo在这里https://github.com/L-vinCent/calculView_function显示计算记录不能连续输入俩个计算符号小数点的位数不能超过俩位单个小数点的时候不能输入00点击+,直接显示计...

一个收款计算器算法,从之前高仿有赞Demo里面抽离的一个界面demo在这里https://github.com/L-vinCent/calculView_function显示计算记录不能连续输入俩个计算符号小数点的位数不能超过俩位单个小数点的时候不能输入00点击+,直接显示计...

一个收款计算器算法,从之前高仿有赞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 *mmock=[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]; }

(编辑:52刷机网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读